這道題的關鍵就是找到全部的點中,x與y互質的點,第一反應一定是暴搜,稍想一下能夠從中分開求一半,但範圍仍然限定了這條路行不通,仔細畫了幾張圖後發現下圖中從第三行起第k行可連fai k個,所以只需從fai3加到fai n便可。ios
程序以下:spa
#include <iostream> #include <cstdio> #include <cmath> #include <cstdlib> #include <algorithm> #include <cstring> #define ll long long #define ull unsigned long long using namespace std; bool f[40001]; ull p[40001]; ull ans[40001]; int main() { int n,tot=0; cin >>n; if (n<=1) { cout <<0 <<endl; return 0; } memset(f,false,sizeof(f)); f[1]=true; for (int i=2;i<=n;i++) { if (!f[i]) { p[++tot]=i; ans[i]=i-1; } for (int j=1;(j<=tot)&&(i*p[j]<=n);j++) { f[i*p[j]]=true; if (i%p[j]==0) { ans[i*p[j]]=ans[i]*p[j]; break; } else { ans[i*p[j]]=ans[i]*(p[j]-1); } } } long long pr=2; for (int i=2;i<=n-1;i++) pr+=ans[i]; cout <<pr*2-1 <<endl; return 0; }