第九十八场周赛. 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;
}
标签:满足条件,正整数,周赛,int,样例,4949,输出,末尾,AcWing
From: https://www.cnblogs.com/neko333/p/17729175.html