A
输出每个比幸运数字大的最小素数

#include
#include
#include
using namespace std;
const int Max=1e6+100;
bool a[Max]={0};
int T,N,n;
void prime(){           //打出素数表
    for(int i=2;i<Max;i++){
        int k=1;
        for(int j=2;j*j<=i;j++){
            if(i%j==0){k=0;break;}      
        }
        if(k)a[i]=1;        //如果是素数·标记其对应下标
    }
}
int main(){
    cin>>T;
    prime();
    int tail=1;
    while(T--){
        cin>>N;
        long long sum=0;
        for(int i=0;i<N;i++){
            cin>>n;
            for(int j=n+1;j<Max;j++){      //从n+1开始遍历输出第一个素数
                if(a[j]==1){sum+=j;break;}    
            }
        }
        printf("Case %d: %lld Xukha\n",tail,sum);
        tail++;
    }
    return 0;
}

C
偶数都可以是两个素数的和,输出该数可以有多少种两素数和的情况

#include
#include
using namespace std;
const int Max=1e7+10;
int T,N;
int a[700000],tail=0;     //刚开始a[Max],老是runtime error.
bool b[Max];
void prime(){           //打印素数表,线性筛
    memset(b,1,sizeof(b));
    b[0]=b[1]=0;
    for(int i=2;i<Max;i++){
        if(b[i]){
            a[tail++]=i;       //a[]储存素数
        }
        for(int j=2*i;j<Max;j+=i){
            b[j]=0;            //对于每个合数对其标记
        }
    }
}
int main(){
    prime();
    scanf("%d",&T);
    int ta=1;
    while(T--){
        scanf("%d",&N);
        int sum1=0;
        for(int i=0;a[i]<=N/2;i++){  //遍历每个素数,如果N-该素数是素数,情况加一
            if(b[N-a[i]]) sum1++;
        }
        printf("Case %d: %d\n",ta++,sum1);
    }
    return 0;
}

D
找出小于该数两个数(a,b)的最小公倍数等于该数的所有情况和且(a<=b)
n=p1^a1 * p2^a2 * p3^a3 * p4^a4...* pn^an (p为素数)
a=p1^b1 * p2^b2 * p3^b3 * p4^b4...* pn^bn (p为素数)
b=p1^c1 * p2^c2 * p3^c3 * p4^c4...* pn^cn (p为素数)
n=icm(a,b)=p1^max(b1,c1) * p2^max(b2,c2) * p3^max(b3,c3)
即,a1=max(b1,c1),a2=max(b2,c2),a3=max(b3,c3)对于a,b至少一个因子指数与n的相等
(n=8
n=2^3
(2^0,2^3),(2^1,2^3),(2^2,2^3),(2^3,2^3),(2^3,2^0),(2^3,2^1),(2^3,2^2)
一共有2*an+1种情况
由于a<b,最后需加一除二
)

#include
#include
#include
#include
using namespace std;
const int Max=1e7+10;
int T,a[Max/10],tail=0;
bool b[Max];
long long N;
void icm(){         //线性筛,打印素数表
    memset(b,1,sizeof(b));
    for(int i=2;i<Max;i++){
        if(b[i]){
            a[tail++]=i;
            for(int j=2*i;j<Max;j+=i){
                b[j]=0;
            }
        }
    }
}
int main(){
    icm();
    cin>>T;
    for(int ta=1;ta<=T;ta++){
        cin>>N;
        long long sum1=1;
        for(int i=0;i<tail && a[i]<=N;i++){    //质因数分解
            int p=0;      
            while(N%a[i]==0){
                p++;    
                N=N/a[i];      
            }
            sum1*=(2*p+1);     //p为n质因子的指数
        }
        if(N!=1)sum1*=3;      //素数表只打印到![图片说明],对于较大的素数另行判断(https://www.nowcoder.com/equation?tex=%5Csqrt%7Bn%7D "图片标题") 
        sum1=(sum1+1)/2;
        printf("Case %d: %lld\n",ta,sum1);
    }
    return 0;
}

E
x=a^b(根据x求b)
求x所有质因子指数的最大公约数

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int Max=1e5+10;
int K,k,s,sym;
long long N;
int a[Max/10],tail=0;
int gcd(int x,int y){      //求最大公约数
    int t;
    if(x<y){t=x;x=y;y=t;}
    while(x%y!=0){
        t=x%y;
        x=y;
        y=t;
    }
    return y;

}
void icm(){    //打印素数表
    for(int i=2;i<Max;i++){
        bool f=1;
        for(int j=2;j*j<=i;j++){
            if(i%j==0){f=0;break;}
        }
        if(f)a[tail++]=i;
    }
}

int main(){
    icm();
    cin>>K;
    for(int ta=1;ta<=K;ta++){
        sym=1;
        cin>>N;
        int ff=1,su;
        if(N<0){N=-N;sym=-1;} //存在负数,先取正,如果是负数·结果只能是奇数
        for(int i=0;i<tail&&a[i]<=N;i++){
            s=0;
            while(N%a[i]==0){
                N=N/a[i];
                s++;       //质因子指数的个数
            }
            if(ff&&s){su=s;ff=0;continue;}
            if(s)su=gcd(s,su);     //求所有指数的最大公约数
        }
        printf("Case %d: ",ta);
        if(N==1){
            if(sym==-1){while(su%2==0)su=su/2;}   //如果是负数,除二的奇数
            cout<<su<<endl;

        }
        else cout<<"1\n";    //如果N是素数输出一

    }
    return 0;
}

F
大数取模,判断余数是否为零

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
short int T;
long long b,x,y;
string a,s;

int main(){
    cin>>T;
    for(int ta=1;ta<=T;ta++){
        cin>>a>>b;
        if(a[0]=='-')a[0]='0';
        if(b<0)b=-b;      //负数取正,不影响结果
        int len=a.size();
        x=a[0]-'0';
        //cout<<x<<endl;
        //cout<<a<<" "<<b<<" "<<len<<" ";
        for(int i=1;i<len;i++){
            x=(x*10+(a[i]-'0'))%b;    //取模
        }
        x=x%b;
        //cout<<x<<endl;
        printf("Case %d: ",ta);
        if(x==0)cout<<"divisible\n";
        else cout<<"not divisible\n";
    }
    return 0;
}

G
计算[a,b]区间素数的个数
排除掉[a,b]内合数,计算b^0.5内的素数的倍数从而排除[a,b]内合数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max=1e5/2;
long long a,b,A;
int T;
int x[Max],tail=0;
bool y[100010];
void prim(){         //线性筛
    for(int i=2;i<Max;i++){
        bool f=1;
        for(int j=2;j*j<=i;j++){
            if(i%j==0){f=0;break;}
        }
        if(f)x[tail++]=i;
    }
}
int main(){
    prim();
    cin>>T;
    for(int ta=1;ta<=T;ta++){
        cin>>a>>b;
        memset(y,0,sizeof(y));
        for(int i=0;i<tail && x[i]<=b;i++){

            A=a/x[i];
            if(A<2)A=2;     //素数的倍数为合数(最小为2)
            for(long long j=x[i]*A;j<=b;j+=x[i]){
                if(j-a>=0){y[j-a]=1;}  //排除[a,b]区间内合数
            }

        }
        int _sum=0;

        for(int i=a;i<=b;i++){
            if(!y[i-a])_sum+=1;    //计算[a,b]内非合数的个数
        }
        if(a==1)_sum--;      //1不是素数
        printf("Case %d: %d\n",ta,_sum);
    }
    return 0;
}

J
计算该行数任意两个数的最大公约数的最大值
python的input()为行输入,暴力枚举求最大公约数

T=int(input())
for i in range(T):
    a=list(map(int,input().split()))   //行输入数组
    l=len(a)
    a=list(sorted(a))
    max1=0
    for j in range(l-1):
        for k in range(j+1,l):
            x=a[j]
            y=a[k]
            while(x%y!=0):        //求最大公约数
                t=x%y
                x=y
                y=t
            max1=max(max1,y)
    print(max1)

H
判断是否为素数

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int N,tail=1;
int main(){
    while(cin>>N){
        int k=1;
        if(N<=0)break;
        if(N==1 || N==2) k=0;
        else{
            for(int i=2;i*i<=N;i++){
                if(N%i==0){k=0;break;}
            }
        }
        printf("%d: ",tail);
        if(k)cout<<"yes\n";
        else cout<<"no\n";
        tail++;
    }
    return 0;
}