Description
Input
Output
输出test行,每行一个整数,表示答案。
Sample Input
1
2
2 2
3 1
2
2 2
3 1
Sample Output
3
HINT
Test<=50 Pi<=10^5,1<=Q1<=10^9
题解:观察给出的式子可以发现答案就是2被phi的次数,
我们用f[i]表示i phi成1的过程中2被phi的次数。
显然如果i是质数则f[i]=f[i-1].
否则f[i*p[j]]=f[i]+f[p[j]](p是质数表)
f数组在线筛中即可处理。
统计完f数组之后把每个质因子的值乘上他们的次数累加进答案即可。
代码:
#include<iostream>
#include<cstdio>
#define N 200010
using namespace std;
int p[N],x,y,t,n,v[N+10];
long long flag,f[N+10],ans;
void pre(){
for (int i=2;i<=N;i++){
if(!v[i])p[++p[0]]=i,f[i]=f[i-1];
for (int j=1;j<=p[0],i*p[j]<=N;j++){
v[i*p[j]]=1;f[i*p[j]]=f[i]+f[p[j]];
if (i%p[j]==0) break;
}
}
}
int main(){
scanf("%d",&t);f[1]=1;pre();
while (t--){
scanf("%d",&n);ans=0;flag=1;
for (int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
ans+=f[x]*(long long)y;if (x==2) flag=0;
}
printf("%lld\n",ans+flag);
}
}