码迷,mamicode.com
首页 > 其他好文 > 详细

杂题训练之二

时间:2019-10-07 19:39:28      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:over   pac   c++   amp   个数   代码   ret   std   模拟   

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;
}

杂题训练之二

标签:over   pac   c++   amp   个数   代码   ret   std   模拟   

原文地址:https://www.cnblogs.com/wzxbeliever/p/11631613.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!