CodeForces 633 B.A Trivial Problem(二分+数论)

来源:互联网 发布:linux python debug 编辑:程序博客网 时间:2024/04/28 21:56

Description
问哪些数的阶乘后面有m个0
Input
一个整数m(1<=m<=1e5)
Output
输出满足条件的数的个数以及升序输出这些数
Sample Input
1
Sample Output
5
5 6 7 8 9
Solution
n!后面0的个数为n!质因子分解后5的幂指数,如果n是满足条件的最小的数字,那么n必然可以被5整除(否则(n-1)!后面必然也有m个0,不符合n的定义),进而n+1,n+2,n+3,n+4都不能被5整除,n+5可以被5整除,那么n,n+1,n+2,n+3,n+4为所有符合条件的答案,所以问题转化为求最小的n,使得n!的素因子分解形式中5的幂指数为m,二分答案即可
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 1111int count(int m){    int ans=0;    while(m)        ans+=m/5,m/=5;    return ans;}int Solve(int m){    int l=1,r=500000,mid,ans=0;    while(l<=r)    {        mid=(l+r)>>1;        if(count(mid)>=m)ans=mid,r=mid-1;        else l=mid+1;    }    if(count(ans)==m)return ans;    return -1;}int main(){    int m;    while(~scanf("%d",&m))    {        int ans=Solve(m);        if(ans==-1)printf("0\n");        else        {            printf("5\n");            for(int i=0;i<5;i++)                printf("%d%c",ans+i,i==4?'\n':' ');        }    }    return 0;}
0 0
原创粉丝点击