Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4044 Accepted Submission(s): 2177
4 5
24 120
赛后清题,组队赛第一场,跪了!!!
这一题考查的是同余定理,但是不能硬做会超时,要剪枝。
注:此题运用的同余定理公式为:(n*m)%c=(n%c*m%c)%c
一,题目是求n的阶乘对2009取余,即可知所有大于等于2009的数的阶乘对2009取余都等于0,所以有以下程序:
#include<cstdio> int main() { int n,i,ans; while(scanf("%d",&n)!=EOF) { ans=1; if(n>=2009) printf("0\n"); else { for(i=2;i<=n;i++) ans=(ans*(i%2009))%2009; printf("%d\n",ans); } } return 0; }
二,2009=41*7*7,即可知所有大于等于41的数的阶乘对2009取余都等于零,时间复杂度再次减少,代码如下:
#include<cstdio> int main() { int n,i,ans; while(scanf("%d",&n)!=EOF) { ans=1; if(n>=41) printf("0\n"); else { for(i=2;i<=n;i++) ans=(ans*(i%2009))%2009; printf("%d\n",ans); } } return 0; }