#欧拉函数

题意

  • 给定n,输出n*n方阵中站在(1,1)可以看到得点

思路

  • 观察发现,能被看到得点一定x,y坐标互质
  • 由于对称性,只求下半个三角就行,也就是对于固定x,求和x互质的数的个数,也就是欧拉函数的板子
  • 边求边加,最后加上左下角三个点就行

代码

#include<bits/stdc++.h>

using namespace std;
using ll=long long;

int v[40404],prime[40404],pi[40404];
int cnt=0;
ll ans=0;
void sieve(int x){
    for(int i=2;i<x;i++){
        if(v[i]==0){
            v[i]=i;
            pi[i]=i-1;
            prime[cnt++]=i;
        }
        for(int j=0;j<cnt;j++){
            if(prime[j]>v[i]) break;
            if(i*prime[j]>x) break;
            v[i*prime[j]]=prime[j];
            if(v[i]==prime[j]) pi[i*prime[j]]=prime[j]*pi[i];
            else pi[i*prime[j]]=pi[i]*pi[prime[j]];
        }
        ans+=pi[i];
        // cout << i << ' ' << pi[i] <<' '<< v[i]<< endl;
    }
}


int main(){
    int n;
    cin >> n ;
    sieve(n);
    cout << ans*2+3 << endl;
    return 0;
}