因为phi满足积性函数,所以将x质因数分解后
φ(x)=∏φ(piki)
然后,考虑每次对x取phi,就相当于对每个
piki
取phi,
φ(piki)=piki−1(pi−1)
,当
pi≠2
时,
pi−1
一定会分出至少一个2的质因子
而
φ(x)=1
的
x
只有2
所以每次取
那么递推,算出x能分出多少个2就行了,要判一开始x的质因子里不含2的情况
#include<set>
#include<map>
#include<deque>
#include<queue>
#include<stack>
#include<cmath>
#include<ctime>
#include<bitset>
#include<string>
#include<vector>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<complex>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn = 1e5+10;
int f[maxn],p[maxn],pri;
bool v[maxn];
void pre()
{
p[pri=1]=2; f[2]=1;
v[4]=true; f[4]=2;
for(int i=3;i<maxn;i++)
{
if(!v[i]) p[++pri]=i,f[i]=f[i-1];
for(int j=1;j<=pri;j++)
{
int k=i*p[j];
if(k>=maxn) break;
v[k]=true;
f[k]=f[i]+f[p[j]];
if(i%p[j]==0) break;
}
}
}
int main()
{
pre();
int t; scanf("%d",&t);
while(t--)
{
int n; scanf("%d",&n);
ll ans=0ll,pi=1;
while(n--)
{
int x,y; scanf("%d%d",&x,&y);
if(!(x&1)) pi=0;
ans+=(ll)y*f[x];
}
printf("%lld\n",ans+pi);
}
return 0;
}