P2568 GCD

【题意】

求满足$1\leq x,y \leq n$,$gcd(x,y)$是质数的数对$(x,y)$数对数

【分析】

首先这个质数d

$ans=\sum_{d}^{n}[d是质数]\sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{n}{d}}[gcd(i,j)==1]$

所以就可以计算出phi,算出前缀和即可计算

【算法】

#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define fi first
#define se second
#define lson now<<1
#define rson now<<1|1
typedef long long ll;
const int maxn=1e7+5;
int n;
int phi[maxn],p[maxn],np[maxn],cnt;
ll sum[maxn];
void init()
{
    phi[1]=1;
    for(int i=2;i<=n;i++)
    {
        if(!np[i])
        {
            p[++cnt]=i;
            phi[i]=i-1;
        }
        for(int j=1;p[j]*i<=n;j++)
        {
            np[i*p[j]]=1;
            if(i%p[j]==0)
            {
                phi[i*p[j]]=phi[i]*p[j];
                break;
            }
            phi[i*p[j]]=phi[i]*(p[j]-1);
        }
    }
    for(int i=1;i<=n;i++) sum[i]=sum[i-1]+phi[i];
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    scanf("%d",&n);
    init();
    ll ans=0;
    for(int i=1;i<=cnt && p[i]<=n;i++)
        ans+=sum[n/p[i]]*2-1;
    printf("%lld",ans);
    return 0;
}

 

posted @ 2021-05-31 14:28  andyc_03  阅读(43)  评论(0编辑  收藏  举报