蓝桥集训之阶乘分解
-
核心思想:线性筛质数
-
- 筛出每一个质数后 只要将所有质数的1 2 3 … 次方个数都加上即可
-
-
#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1e6+10;int prime[N],cnt;int n;bool st[N];void get_primes(int n){for(int i=2;i<=n;i++){if(!st[i]) prime[cnt++] = i; //没有被筛 是质数 记录下来for(int j=0;prime[j]*i<=n;j++) //遍历所有质数 筛掉其倍数{st[prime[j]*i] = true; //prime[j]*i保证在n以内if(i%prime[j] == 0) break; //如果i是prime[j]倍数 说明prime[j]为i最小因数}}}int main(){cin>>n;get_primes(n);for(int i=0;i<cnt;i++){int p = prime[i];int s = 0,t = n;while(t) s+=t/p , t/=p; //t可能是p的平方 要加两次cout<<p<<" "<<s<<endl;}return 0;}