第九十八场周赛. AcWing 4949. 末尾连续0

发布时间 2023-09-25 23:54:54作者: neKo2333

第九十八场周赛. AcWing 4949. 末尾连续0

给定一个正整数 \(m\),请你统计一共有多少个正整数 \(n\) 满足,\(n\) 的阶乘的末尾连续 \(0\) 的数量恰好为 \(m\)

输出满足条件的 \(n\) 的数量以及所有满足条件的 \(n\)

例如,当 \(m=1\) 时,满足条件的正整数 \(n\) 共有 \(5\) 个,分别是 \(5,6,7,8,9,\) 其中 \(5!=120,6!=720,7!=5040,8!=40320,9!=362880\)

输入格式

共一行,一个正整数 \(m\)

输出格式

如果存在满足条件的 \(n\),则第一行输出满足条件的 \(n\) 的数量,第二行按从小到大的顺序输出所有满足条件的 \(n\)

如果不存在满足条件的 \(n\),则输出一行 0 即可。

数据范围

前 55 个测试点满足 \(1≤m≤10\)
所有测试点满足 \(1≤m≤10^5\)

输入样例1:

1

输出样例1:

5
5 6 7 8 9

输入样例2:

5

输出样例2:

0
思路分析:只需要将n!分解质因数找其中的5的个数就行了,如果分解质因数有一个5,那么一定会有一个对应的2,这个可以证明。一个5
对应一个2,尾部必定有一个0,两个5对应两个2,尾部必定有两个0。可以用前缀和存5的个数。
ps:居然比上一题做的快,逆天。
代码:
#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int N=1000010;
vector<int> res;
int q[N];//前缀和数组
int m,cnt;
int main(){
    for(int i=1;i<N;i++){
        int s=0,t=i;
        while(t%5==0) s++,t=t/5;
        q[i]=q[i-1]+s;
    }
    cin>>m;
    for(int i=0;i<N;i++) if(q[i]==m) res.push_back(i);//符合条件的push进去
    //按题目要求输出就行了
    if(res.size()){
        cout<<res.size()<<endl;
        for(auto it:res) cout<<it<<' ';
    } else cout<<0;
    return 0;
}