51nod 1057 n的阶乘 (压位优化)
题目地址:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1057&judgeId=605203
使用压位进行优化,即一位数存多位数,例如当设置MOD=1e8时,一位数可以存8位数;
其次,注意尾数0,因为压位,一位需要输出8个0,故第一个数应单独输出;
这样优化可以到100ms以内;
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 6 #define min(a,b) a>b?b:a 7 #define LL long long 8 const LL MOD = 1e8; 9 const int N = 10000; 10 LL n, a[N]; 11 12 int main() 13 { 14 while(~scanf("%lld", &n)) 15 { 16 memset(a, 0, sizeof(a)); 17 a[0]=1; 18 19 int len=0, carry=0; 20 for(int i=2; i<=n; i++) { 21 carry=0; 22 for(int j=0; j<=len; j++) { 23 a[j] = a[j]*i+carry; 24 carry = a[j]/MOD; 25 a[j] %= MOD; 26 } 27 if(carry>0) { 28 a[++len]=carry; 29 } 30 } 31 printf("%lld", a[len--]); 32 while(len>=0) { 33 printf("%0.8lld", a[len]); 34 len--; 35 } 36 putchar('\n'); 37 } 38 return 0; 39 }