USACO 3.2 Factorials(高精度乗算)
10285 ワード
水が通るでしょう.O(n^2)のアルゴリズムを直接シミュレートし,O(n*logn)のアルゴリズムがあり,研究した.
浙江大学はNを求めます!最後に0ビット以外の階乗テンプレート.2012.11.22
浙江大学はNを求めます!最後に0ビット以外の階乗テンプレート.2012.11.22
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
using namespace std;
int lastdigit(char* buf)
{
const int mod[20] = {1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
int len = strlen(buf),a[10000],i,c,ret = 1;
if(len == 1)
return mod[buf[0]-'0'];
for(i = 0;i < len;i ++)
{
a[i] = buf[len-1-i]-'0';
}
for(;len;len-=!a[len-1])
{
ret = ret*mod[a[1]%2*10+a[0]]%5;// 。。
for(c = 0,i = len-1;i >= 0;i --)
{
c = c*10+a[i],a[i]=c/5,c%=5;
}
}
return ret+ret%2*5;
}
int main()
{
char str[501];
while(scanf("%s",str)!=EOF)
{
printf("%d
",lastdigit(str));
}
return 0;
}
1 /*
2 ID: cuizhe
3 LANG: C++
4 TASK: fact4
5 */
6 #include<stdio.h>
7 #include<string.h>
8 int p[300000];
9 int main()
10 {
11 int a,b,i,j;
12 freopen("fact4.in","r",stdin);
13 freopen("fact4.out","w",stdout);
14 scanf("%d",&a);
15 p[0]=1;
16 j=0;
17 for(b=1; b<=a; b++)
18 {
19 for(i=0; i<=j; i++)
20 {
21 p[i]=p[i]*b;
22 }
23 for(i=0; i<=j; i++)
24 {
25 if(p[i]>9)
26 {
27 p[i+1]+=p[i]/10;
28 p[i]=p[i]%10;
29 if(i+1>j)
30 j=i+1;
31 }
32 }
33 }
34 for(i = 0; i <= j; i++)
35 {
36 if(p[i] != 0)
37 {
38 printf("%d
",p[i]);
39 break;
40 }
41 }
42 return 0;
43 }