1)
首先应该想到,当n>=2009,得到的数都可以整除2009,所以取模2009以后都应该输出为0
其次,n<2009的数阶乘得到的数也很大,应该有规律,所以可以先打表找规律
#include <iostream>?///打表发现,当n为41,就能整除2009,取模就会为0,之后的数自然都为0
#include <string.h>
using namespace std;
int main()
{
long long int n=42,sum=1;
for(int i=1;i<=n;i++){
long long int a=i;
if(sum>=2009)
sum%=2009;
cout<<sum<<" ";
sum*=a;
cout<<sum<<endl;
}
}
AC代码:
#include <iostream>
#include <stdio.h>
#include <string>
#include <string.h>
#include <math.h>
using namespace std;
int main()
{
string str;
while(cin>>str){
int len=str.length();
if(len>3){
cout<<"0"<<endl;
continue;
}
else {
int num=0;
int j=0;
//cout<<len<<endl;
for(int i=len-1;i>=0;i--){
int pf=pow(10,j++);
int s=str[i]-'0';//如果不转int,那么也会通过编译但是会计算出匪夷所思的结果。
//cout<<"pf:"<<pf<<endl;
//cout<<"s:"<<s<<endl;
//cout<<"(s*pf):"<<(s*pf)<<endl;
num+=(s*pf);
//cout<<"num:"<<num<<endl;
}
int res=1;
for(int i=1;i<=num;i++){
res*=i;
if(res>=2009)
res%=2009;
}
cout<<res<<endl;
continue;
}
return 0;
}
}
2)
N!AgainTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4451 Accepted Submission(s): 2352
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
Sample Output
Author
WhereIsHeroFrom
Source
|