N!Again
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4008 Accepted Submission(s): 2152
Problem Description
WhereIsHeroFrom: Zty, what are you doing ?
Zty: I want to calculate N!……
WhereIsHeroFrom: So easy! How big N is ?
Zty: 1 <=N <=1000000000000000000000000000000000000000000000…
WhereIsHeroFrom: Oh! You must be crazy! Are you Fa Shao?
Zty: No. I haven’s finished my saying. I just said I want to calculate N! mod 2009
Hint : 0! = 1, N! = N*(N-1)!
Input
Each line will contain one integer N(0 <= N<=10^9). Process to end of file.
Output
For each case, output N! mod 2009
Sample Input
4
5
Sample Output
24
120
思路: 数字给的太大了。可能有规律,就打了个表看看
打表代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 10000
#define MOD 2009
#define LL long long
int main()
{
int n;
n=50;
LL i,j;
LL s=1;
for(i=1;i<200;i++)
{
s=s*i%MOD;
printf("%lld\t",s);
}
}
看了输出就能够看到,经过某一项之后都是0
同时根据 同余定理 ,可知道 其中有一项(41!)肯定是可以整除2009 的;
代码
#include<stdio.h>
#include<string.h>
#include<math.h>
#define M 10000
#define MOD 2009
#define LL long long
int main()
{
LL n;
while(~scanf("%lld",&n))
{
if(n>=41) printf("0\n");
else
{
int i;LL ans=1;
for(i=1;i<=n;i++) ans=(ans*i)%MOD;
printf("%lld\n",ans);
}
}
return 0;
}