杂题训练之二

Posted wzxbeliever

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杂题训练之二相关的知识,希望对你有一定的参考价值。

https://www.luogu.org/problem/P1134

基本思路:

纯模拟,算0前的最后1位。

末尾0就是多个10相乘得来的 ,

我们只需要在相乘算个位数时将末尾0的个数的2,5提前约去即可

计算末尾0的个数,只需要计算1~n中有多少个因数5,

因为因数2的个数肯定比5多 ,每一组2,5凑成10.

计算出来后,在从1~n相乘时,约去对应个数的2,5,再取 个位,结尾肯定没有0,膜10得来的数就是答案。

具体见代码

code by jklover:

#include<bits/stdc++.h>
using namespace std;
int main()

    int n,s=1,k1=0,k2=0;//s计算结果,k1,k2分别计算2,5需要除去的个数 
    scanf("%d",&n);
    for(int i=2;i<=n;i++)
    
        int m=i;//i是不能随便除的,我们把它的值赋给m 
        while(!(m%5))
            
                m/=5;
                k2++;//只用计算因数5的个数 
            
    
    k1=k2;//2也只需要除这么多 
    for(int i=2;i<=n;i++)
        
            int p=i;//i不能随便除 
            while(!(p%2)&&k1)//整除,并且次数够 
            
                p/=2;
                k1--;
            
            while(!(p%5)&&k2)//同理 
            
                p/=5;
                k2--;
            
            s*=p%10;
            s%=10;//只用计算个位 
        
    printf("%d",s);
    return 0;

以上是关于杂题训练之二的主要内容,如果未能解决你的问题,请参考以下文章

杂题训练之三

杂题训练之十

杂题训练之四

codeforces 杂题训练

_杂题_

[做题笔记] pb大师的杂题选讲