大一集训--c++线性筛/素数筛

线性筛/素数筛

题目一: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 
//C
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 
//D
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 
//I
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;
        }
    }
}

你可能感兴趣的:(c++入门,数据结构)