首页 > 代码库 > HDU 5139

HDU 5139

题目意思是f(n)=1!*2!*...*n!

求f(n);

如果直接开个10^7大的数组,会直接超内存

而时间是2s,所以用时间换内存

就开了两个10^6的数组,n[i]表示(i*10)!,f[i]表示f(i*10);

(注意运算过程就爆int)

 1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int N=1000002; 5 const int mod=1000000007; 6 int n[N],f[N]; 7 void getnum(){ 8     n[0]=f[0]=1; 9     for(int i=1;i<N;i++){10         int tem=n[i-1];11         f[i]=f[i-1];12         for(int j=(i-1)*10+1;j<=i*10;j++){13             tem=(long long) tem*j%mod;14             f[i]=(long long) f[i]*tem%mod;15         }16         n[i]=tem;17     }18 }19 int main()20 {    getnum();21     int a;22     while(scanf("%d",&a)!=EOF){23         if(a%10==0)printf("%d\n",f[a/10]);24         else {25             int i,k,j=a%10;26             i=k=a/10;27             int tem=n[i],sum=f[i];28             for(i=i*10+1;i<=a;i++){29                 tem=(long long) tem*i%mod;30                 sum=(long long) sum*tem%mod;31             }32             printf("%d\n",sum);33         }34     }35     return 0;36 }

 

HDU 5139