CodeForces - 633B【A Trivial Problem】(找规律)

【第一点】注意将10分解可以得到:10=2*5;每次连续的0增加1说明源数字乘以10;分解一下就是乘以2和乘以5

由于需要乘以5,所以每次遇到5的倍数时才有可能连续的0增加1个

【第二点】特殊情况是遇到的数字不仅仅是5的倍数,有可能是25,125,...的倍数,此时直接增加连续2个0,3个0... 

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int n;
int ans[9]=
{25,125,625,3125,15625,78125,78125*5,78125*25,78125*125};
int num[maxn];
void init()
{
    memset(num,0,sizeof(num));
    int top=0;
    bool flag;
    for(int i=1; i<=100000; ++i)
    {
        top++;
        flag=0;
        for(int j=8; j>=0; --j)
            if((5*top)%ans[j]==0)
            {
                i+=j+1;
                num[i]=top;
                flag=1;
                break;
            }
        if(flag)
            continue;
        num[i]=top;
    }
}
int main()
{
    init();
    while(~scanf("%d",&n))
    {
        if(num[n]>0)
        {
            printf("5\n");
            for(int i=0; i<=3; ++i)
                printf("%d ",5*num[n]+i);
            printf("%d\n",5*num[n]+4);
        }
        else
            printf("0\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41658955/article/details/86670361