一、质因数分解,筛法,求因数个数
发布时间
阅读量:
阅读量
//质因数分解
int factorize(int x,int p[])
{
int cnt=0;
for(int i=2;i*i<=x;i++)
{
while(x%i==0)
{
p[++cnt]=i;
x/=i;
}
}
if(x!=1)p[++cnt]=x;
return cnt;
}
//求因数个数
int d[105]={0},n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;i*j<=n;j++)
d[i*j]++;
for(i=1;i<=10;i++)
printf("d[%d]=%d\n",i,d[i]);
以luogu3383为例
1、线性筛素数
#include <iostream>
#include <algorithm>
#define maxn 10000010
using namespace std;
int vis[maxn],prime[maxn],n,m;
long long temp;
void lxs()
{
int cnt=0;
for(int i=2;i<=n;i++)
{
if(!vis[i])prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
{
vis[i*prime[j]]=prime[j];
if(i%prime[j]==0)break;
}
}
}
int main()
{
cin>>n>>m;
vis[1]=1;
lxs();
for(int i=1;i<=m;i++)
{
cin>>temp;
if(vis[temp]!=0)cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}
埃筛
#include <iostream>
#define maxn 10000010
using namespace std;
bool no_prime[maxn];
long long temp;
int prime[maxn],n,m;
void sieve()
{
no_prime[1]=true;
for(int i=2;i<=n;i++)
{
if(!no_prime[i])
for(int j=i+i;j<=n;j+=i)no_prime[j]=true;
}
}
int main()
{
cin>>n>>m;
sieve();
for(int i=1;i<=m;i++)
{
cin>>temp;
if(no_prime[temp])cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}
全部评论 (0)
还没有任何评论哟~
