lalalala


私信TA

用户名:zhangshuo

访问量:161490

签 名:

像狗一样的学习,像绅士一样地玩耍。

等  级
排  名 7
经  验 31290
参赛次数 10
文章发表 201
年  龄 12
在职情况 学生
学  校 芜湖市第十一中学
专  业

  自我简介:

今日懒惰流下的口水,将会成为明日里伤心的泪水。

解题思路:

暴力 暴力乘,每次保留得到的数的后7位左右(保证不出现误差)

如果每次 mod 10,会造成误差.因为当相乘后得到的是10的倍数时,mod 10 会变成0.所以每次大概mod 1000000.最后输出ans%10

原理:最后一位相乘只会影响最后一位.故只保留最后几位就行了

数学方法:有两种.第一种分析10怎么出现.发现如果两个数的因数中分别有2,5.那么相乘末尾一定有0.于是统计1~N中每个数的因数中2和5的个数.用2的个数减去5的个数(2的个数一定比5的个数多).剩下的是会对答案(即末尾的数)造成影响.之后大胆mod 10 就行了.

第二种应该是正解.

分析:N!的末尾只会是2,4,6,8(在此题中没有0).又[2,4,6,8]中任意一个数乘6,末尾仍是本身.2 * 6 = 12,末尾为2, 4 * 6 =24,末尾为4, 6 * 6=36,末尾为6,8 * 6 =48,末尾为8.又末尾数字只受末尾数字影响,如4. 4 * 6得到的末尾数字与4 * 16的末尾数字一样.又4 * 10=40,末尾数字为4(此题不要末尾0).则4 * 2 *8==4 * 2 *5(意思是得到的末尾数字是一样的).故所有乘5的时候都可以换为乘8.又多次乘8末尾是有规律的.找出规律即可.

前两种方法就不贴代码了,贴一下正解代码并进一步解释:






注意事项:





参考代码:

#include<cstdio>
#include<cstring>
int n;
long long ans=1;
int main()
{
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    {
        ans*=1ll*i;
        while(ans%10==0) ans/=10;
        ans%=100000000;
    }
    printf("%lld\n",ans%10);
    return 0;
}


 

0.0分

0 人评分

  评论区

  • «
  • »