阶乘分解 contest 数论基础——质数 T4
Posted virtual-north-illya
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阶乘分解 contest 数论基础——质数 T4相关的知识,希望对你有一定的参考价值。
Description
给定一个整数N,把N!分解质因子,N!=∑pi^ci 其中(pi为质数,且p1<p2<p3...)。
Input
一个整数N。
Output
输出质因数 次数
Hint
1<=N<=10^6
Solution
N!中质因子的个数就等于1~N每个数包含质因子p的个数之和。在1~N中,至少包含一个p的有N/p个,而包含两个p的有N/p^2个。但其中一个质因子的已经在N/p里面加过了,所以只需要在统计第二个因子,就是加N/p^2而不*2。
对于每个p时间复杂度是O(logN),总的时间复杂度是O(NlogN)。特别要注意的是,代码中comm需要long long,否则溢出后成了负数会死循环。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 1000005
#define inf 0x3f3f3f3f
using namespace std;
int primes[maxn],num[maxn],ans[maxn];
int cnt,n;
inline void OULA(){
for(int i=2;i<=maxn;i++){
if(!num[i])primes[++cnt]=i;
for(int j=1;i*primes[j]<=maxn;j++){
num[i*primes[j]]=true;
if(i%primes[j]==0)break;
}
}
}
inline void workk(){
for(int i=1;primes[i]<=n;i++){
int val=0,j=1;
long long comm=0;
while(true){
comm=pow(primes[i],j);
if(comm>n)break;
val+=n/comm;
j++;
}
ans[i]=val;
}
}
int main(){
scanf("%d",&n);
OULA();
workk();
for(int i=1;primes[i]<=n;i++){
if(ans[i]!=0){
printf("%d %d
",primes[i],ans[i]);
}
}
return 0;
}
=N<=10^6
以上是关于阶乘分解 contest 数论基础——质数 T4的主要内容,如果未能解决你的问题,请参考以下文章