【数论】Visible Lattice Points

#include <bits/stdc++.h>

using namespace std;

const int maxn=1100;
typedef long long ll;

ll phi[maxn],ans,prime[maxn],n,tot;
bool vis[maxn];
void get_euler(ll n)
{
    phi[1]=1;
    for (int i=2; i<=n; i++)
    {
        if (!vis[i])
        {
            prime[tot++]=i;
            phi[i]=i-1;
        }
        for (int j=0; j<tot&&1ll*prime[j]*i<=n; j++)
        {
            vis[prime[j]*i]=1;
            if (i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}

int main()
{
    int _,k=0;
    scanf("%d",&_);
    get_euler(1100);
    while (_--)
    {
        k++;
        ans=0;
        scanf("%lld",&n);
        for (int i=1; i<=n; i++)
        {
            ans+=phi[i];
        }
        printf("%d %lld %lld
",k,n,ans*2+1);
    }
}

  

原文地址:https://www.cnblogs.com/Accpted/p/11334387.html