[HAOI2012]外星人 题解

人类智慧题。
首先,只有 (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;
}
原文地址:https://www.cnblogs.com/wzzyr24/p/13324362.html