N!Again |
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) |
Total Submission(s): 1447 Accepted Submission(s): 788 |
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 |
思路:
n!=1*2*3*...*(n-1)*n;
题目n很大,但是..转个思路就很简单;
因为总会有一个n!%2009=0 , 就是说 n ! 是2009的倍数,那么存在所有 k >=n , k!% 2009 =0;
因为当 k >= n , k ! = n ! * (n+1) * ( n+2 ) *...*k ;
打表可以知道 41!% 2009 =0;
代码如下:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long LL;
LL t[41]={1};
int main()
{
for(int i=1;i<=40;i++)
{
t[i]=(t[i-1]*i)%2009;
// cout<<i<<" "<<t[i]<<endl;
}
int n;
while(cin>>n)
{
if(n<=40)
cout<<t[n]<<endl;
else
cout<<"0"<<endl;
}
return 0;
}