USACO--3.1Factorials

来源:互联网 发布:顺丰软件 编辑:程序博客网 时间:2024/05/21 00:45

我开始用了一种比较笨的做法,直接用高精度将阶乘给算出来了,然后直接求出最后非零位。

其实开始的时候我的猜想是每次我们只需要用上次结果的最后非零位乘上这次的最后的非零位,应该就可以得到答案呢。但是这样的猜想是不对的,因为如果最后一位是5的话就会打破这个规律,如果我们就可以将每个数中的2,5因子都去掉,就可以用上面的猜想了。但是又要注意到2的因子数比5的多,所以我们在最后还得将多除了的2乘回去。

因为这个题的n比较小,所以我们也可以每次都只保留结果非零的最后5位,然后最后直接得到答案。


代码如下:



/*ID:15674811LANG:C++PROG:fact4*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 11000int main(){    //freopen("fact4.in","r",stdin);    //freopen("fact4.out","w",stdout);    int n,a[maxn];    while(scanf("%d",&n)!=EOF)    {         a[1]=1;         int cnt=1,flag;         for(int i=2;i<=n;i++)         {             flag=0;             for(int j=1;j<=cnt;j++)             {                 a[j]=a[j]*i+flag;                 if(a[j]>9)                 {                     flag=a[j]/10;                     a[j]%=10;                 }                 else                    flag=0;             }             while(flag)             {                 a[++cnt]=flag%10;                 flag/=10;             }         }         int i;         for(i=1;i<=cnt;i++)            if(a[i]!=0)                break;         printf("%d\n",a[i]);    }  return 0;}


/*ID:15674811LANG:C++PROG:fact4*/#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define maxn 11000int main(){    freopen("fact4.in","r",stdin);    freopen("fact4.out","w",stdout);    int n,a[maxn];    while(scanf("%d",&n)!=EOF)    {        int sum=1,mod;        for(int i=1;i<=n;i++)        {            int j=i;            while(j%2==0)            {                n1++;                j/=2;            }            while(j%5==0)            {                n2++;                j/=5;            }            sum=(sum*j)%10;        }        for(int i=1;i<=n1-n2;i++)            sum=sum*2%10;        printf("%d\n",sum);    }  return 0;}


1 0
原创粉丝点击