线性筛/素数筛
题目一:P586
#include
using namespace std;
const int MAXX=1e6+1;
int ans[MAXX];
int vis[MAXX];
int viss[MAXX]={0};
int flag=0;
void sss(int n);
int main()
{
int n;
sss(1000000);
while(scanf("%d",&n)!=-1)
{
int k=1;
while(n)
{
if(viss[n]==0)
{
k=0;
break;
}
if(n>10)
{
int t=10;
while(n>t*10)
t*=10;
n%=t;
}
else
{
break;
}
}
if(!k)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
void sss(int n)
{
memset(vis,1,sizeof(vis));
vis[0]=vis[1]=0;
for(int i=2;i<=n;i++)
{
if(vis[i])
{
ans[++flag]=i;
viss[i]=1;
}
for(int j=1;j<=flag&&i*ans[j]<=n;j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}
题目二:P587
#include
using namespace std;
const int MAXX=1e6+60;
int ans[MAXX];
int vis[MAXX];
int viss[MAXX]={0};
int flag=0;
void sss(int n);
int main()
{
int n;
sss(1000050);
while(scanf("%d",&n)!=-1)
{
int k=0;
if(viss[n])
{
printf("NO\n");
continue;
}
for(int j=1;ans[j]<=n;j++)
{
if(n%ans[j]==0)
{
if(viss[n/ans[j]])
{
k=1;
}
break;
}
}
if(k)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
void sss(int n)
{
memset(vis,1,sizeof(vis));
vis[0]=vis[1]=0;
for(int i=2;i<=n;i++)
{
if(vis[i])
{
ans[++flag]=i;
viss[i]=1;
}
for(int j=1;j<=flag&&i*ans[j]<=n;j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}
题目三:P825
#include
using namespace std;
const int MAXX=1e4+1;
int ans[MAXX];
int vis[MAXX];
int flag;
void sss(int n);
int main()
{
int n;
sss(10000);
while(scanf("%d",&n)!=-1)
{
int flag=1;
for(int i=1; ans[i]<=sqrt(n*1.0); i++)
{
if(n%ans[i]==0)
{
flag=0;
break;
}
}
if(!flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
void sss(int n)
{
memset(vis,1,sizeof(vis));
vis[0]=vis[1]=0;
for(int i=2; i<=n; i++)
{
if(vis[i])
{
ans[++flag]=i;
}
for(int j=1; j<=flag&&i*ans[j]<=n; j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}
题目四:P585
#include
using namespace std;
int vis[1000100];
int ans[1000100];
int flag=0;
void ss(int n);
int LDF(int n);
int main()
{
ss(1000050);
int n;
while(scanf("%d",&n)!=-1)
{
cout << LDF(n) << endl ;
}
return 0;
}
void ss(int n)
{
memset(vis,1,sizeof(vis));
for(int i=2;i<=n;i++)
{
if(vis[i])
ans[++flag]=i;
for(int j=1;j<=flag&&i*ans[j]<=n;j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}
int LDF(int n)
{
if(n==1)
return 0;
int t;
for(int i=1;ans[i]<=n;i++)
{
if(n%ans[i]==0)
t=i;
}
return t;
}
题目五:P781
#include
using namespace std;
const int maxx=1e6+5;
int ans[maxx];
int vis[maxx];
int visnum[maxx]={0};
int flag=0;
void ss(int n);
int main()
{
int x,y;
ss(1000000);
while(scanf("%d%d",&x,&y)!=-1)
{
printf("%d\n",visnum[y]-visnum[x-1]);
}
return 0;
}
void ss(int n)
{
memset(vis,1,sizeof(vis));
for(int i=2;i<=n;i++)
{
if(vis[i])
ans[++flag]=i;
visnum[i]=flag;
for(int j=1;j<=flag&&i*ans[j]<=n;j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}
题目六:P1669
#include
using namespace std;
int main()
{
long long x,y;
int gg;
cin >> x >> y;
gg=__gcd(x,y);
int flag=0;
for(int i=1;i<=sqrt(gg*1.0);i++)
{
if(gg%i==0)
flag+=2;
if(i==sqrt(gg*1.0))
flag--;
}
cout << flag << endl ;
return 0;
}
题目七:P1704
#include
using namespace std;
const int maxx=2*1e7+10;
int vis[maxx];
int ans[maxx];
int flag=0;
void ss(int n);
int main()
{
int n;
cin >> n;
ss(20000000);
long long x,y,z;
while(n--)
{
cin >> x >> y >> z;
int k=1;
long long pd=x+y-z;
for(int i=1;ans[i]<=sqrt(pd*1.0);i++)
{
if(pd%ans[i]==0)
{
k=0;
break;
}
}
if(k)
cout << "yes" << endl ;
else
cout << "no" << endl ;
}
return 0;
}
void ss(int n)
{
memset(vis,1,sizeof(vis));
for(int i=2;i<=n;i++)
{
if(vis[i])
ans[++flag]=i;
for(int j=1;j<=flag&&i*ans[j]<=n;j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}
题目八:P2113
#include
using namespace std;
const int maxx=4e7+5;
int vis[maxx];
int ans[maxx];
int flag=0;
void ss(int n);
int main()
{
int n,q;
scanf("%d",&n);
ss(n);
scanf("%d",&q);
int x;
while(q--)
{
scanf("%d",&x);
printf("%d\n",ans[x]);
}
return 0;
}
void ss(int n)
{
memset(vis,1,sizeof(vis));
for(int i=2;i<=n;i++)
{
if(vis[i])
ans[++flag]=i;
for(int j=1;j<=flag&&i*ans[j]<=n;j++)
{
vis[i*ans[j]]=0;
if(i%ans[j]==0)
break;
}
}
}