CF Manthan, Codefest 16 B. A Trivial Problem

数学技巧真有趣,看出规律就很简单了 wa

题意:给出数k  输出所有阶乘尾数有k个0的数

这题来来回回看了两三遍, 想的方法总觉得会T

后来想想  阶乘 emmm  1*2*3*4*5*6*7*8*9*10...*n 尾数的0只与5有关

是5的几倍就有几个0  因为5前面肯定有偶数 乘起来就有一个0 而且最后输出肯定是连续的5个

hhh 兴奋 开始上手 乱搞一下  发现复杂度还行  

测样例 发现 k=5 的时候不对了 输出25~29了 应该是0的

咦  测了一下 25!应该是6个0的 25=5*5  有两个5  wa 

每次循环找的时候都判断是否是5的倍数,是则不断除5,计数累加; 否则继续下一循环

hhh 又乱搞了一下 A了

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> p;
typedef long double ld;
#define mem(x) memset(x, 0, sizeof(x))
#define me(x) memset(x, -1, sizeof(x))
#define fo(i,n) for(i=0; i<n; i++)
#define sc(x) scanf("%lf", &x)
#define pr(x) printf("%lld
", x)
#define pri(x) printf("%lld ", x)
#define lowbit(x) x&-x
const ll MOD = 1e18 +7;
const ll N = 6e6 +5;
int main()
{
    ll i, j, k, l=0;
    ll n, m, t=5;
    cin>>k;
    ll co=1;
    while(1)
    {
        if(co>=k) break;
        t+=5; //不断+5 统计5的个数
        m=t;
        while(m%5==0)  //统计该数有几个5
        {
            m/=5;
            co++;
        }
    }
    if(co>k)
    {
        cout<<0<<endl;
        return 0;
    }
    cout<<5<<endl;
    for(i=t;i<=t+4; i++)
    {
        cout<<i<<' ';
    }cout<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/op-z/p/10791159.html