牛客多校第四場
阿新 • • 發佈:2020-07-20
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