题解:对每一个>2的质数分解,最后统计2的个数
注意:如果一开始没有2则ans需+1,因为第一次求phi的时候并没有消耗2
WA了好几遍
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int u=200000; int T; int m; long long ans; long long a[u+10]; void Div(int n,long long k){ for(int i=2;i*i<=n;++i){ while(n%i==0){ a[i]+=k;n/=i; } } if(n>1)a[n]+=k; } void Getans(){ for(int i=u;i>=2;--i){ if(a[i]==0)continue; ans=max(ans,a[i]); Div(i-1,a[i]); } } int main(){ scanf("%d",&T); while(T--){ memset(a,0,sizeof(a)); ans=0; scanf("%d",&m); while(m--){ int x,y; scanf("%d%d",&x,&y); a[x]=y; } int fla=(a[2]?0:1); Getans(); printf("%lld\n",ans+fla); } return 0; }