1. 程式人生 > 實用技巧 >牛客多校第四場

牛客多校第四場

A.Ancient Distance

B.Basic Gcd Problem

C.Count New String

D.Dividing Strings

E.Eliminate++

F.Finding the Order

G.Geometry Challenge

H.Harder Gcd Problem

const int N=2e5+10;
int n,m,k;
int a[N],b[N];
int vis[N],prim[N],is[N];
int num=0;
void euler(int n){
    num=0;
    for (int i=2;i<=n;i++){
        if (vis[i]==0)prim[++num]=i;
        for (int j=1;j<=num&&prim[j]*i<=n;j++){
            vis[i*prim[j]]=1;
            if (i%prim[j]==0)break;
        }
    }
}
vector<pair<int,int>>p;
void solve(){
    scanf("%d",&n);
    for (int i=1;i<=n;i++)is[i]=0;
    int t=upper_bound(prim+1,prim+1+num,n)-prim-1;
    int cnt=0;
    for (int i=t;i>=1;i--){
    	int f=0,ff=0;
    	for (int j=n/prim[i];j>=2;j--){
            if (!is[j*prim[i]]){
    	        if (ff==0){
    		    ff=1;
    		    cnt++;
    		    p.push_back({j*prim[i],prim[i]});
                    is[j*prim[i]]=1;is[prim[i]]=1;
                }
    		else if (f==0)f=j;
    		else{
    		    cnt++; 
    		    p.push_back({f*prim[i],j*prim[i]});
                    is[f*prim[i]]=1;is[j*prim[i]]=1;
    	            f=0;
		}
	    }
	}
    }
    printf("%d\n",cnt);
    for (int i=0;i<cnt;i++){
	printf("%d %d\n",p[i].first,p[i].second);
    }
    p.clear();
}
int main(){
    euler(2e5);
    int T=1;
    scanf("%d",&T);
    while (T--){
        solve();
    }
    return 0;
}

I.Investigating Legions

J.Jumping on the Graph