HDU-2674 N!Again

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;
}


猜你喜欢

转载自blog.csdn.net/weixin_41049440/article/details/80878149