人类智慧题。
首先,只有 (varphi(1)=varphi(2)=1)。再考虑题目中给的提示:
[varphileft(prod_{i = 1}^m p_i^{q_i}
ight) = prod_{i = 1}^m (p_i - 1)p_i^{q_i-1}
]
那么题目答案显然可以转化为一个数在操作过程中出现了多少个 (1)。
记 (f(x)) 表示 (x) 在操作过程中产生了多少个 (1),现在来发掘一下性质。
因为贡献互不影响,所以有 (f(p)=f(p-1)) 以及 (forall a,b,f(ab)=f(a)+f(b))。
然后就可以直接筛了,注意特判没有质因子 (2) 的情况。
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n=1e5,m,f[N],pri[N];
long long ans=1; bool v[N];
int main()
{
f[1]=1;
for(int i=2;i<=n;++i)
{
if(!v[i]) pri[++pri[0]]=i,f[i]=f[i-1];
for(int j=1;j<=pri[0]&&i*pri[j]<=n;++j)
{
v[i*pri[j]]=1; f[i*pri[j]]=f[i]+f[pri[j]];
if(i%pri[j]==0) break;
}
}
int Case; scanf("%d",&Case);
while(Case--)
{
scanf("%d",&m); ans=0; bool fl=1;
for(int i=1,x,c;i<=m;++i)
{
scanf("%d%d",&x,&c),ans+=1LL*f[x]*c;
if(x==2) fl=0;
}
printf("%lld
",ans+fl);
}
return 0;
}