首先像我一样把柿子画出来或者看下hint
你就会发现其实是多了个p-1这样的东东
然后除非是2他们都是偶数,而2就直接到0了
算一下2出现的次数就好
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; bool v[110000]; int pr,prime[110000],f[110000]; void get_prime() { memset(v,true,sizeof(v));f[1]=1; for(int i=2;i<=100000;i++) { if(v[i]==true) { prime[++pr]=i; f[i]=f[i-1]; } for(int j=1;j<=pr&&i*prime[j]<=100000;j++) { v[i*prime[j]]=false; f[i*prime[j]]=f[i]+f[prime[j]]; if(i%prime[j]==0)break; } } } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); get_prime(); int T; scanf("%d",&T); while(T--) { int n,p,q;LL ans=0,t=1; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d%d",&p,&q); if(p==2)t=0; ans=ans+(LL(f[p]))*(LL(q)); } printf("%lld ",ans+t); } return 0; }