BZOJ 2190 仪仗队
这道题的关键就是找到所有的点中,x与y互质的点,第一反应必定是暴搜,稍想一下可以从中分开求一半,但范围仍然限定了这条路行不通,仔细画了几张图后发现下图中从第三行起第k行可连fai k个,因此只需从fai3加到fai n即可。
程序如下:
#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; }