bzoj2190 仪仗队
思路:
哪些点能被人看到,其实就是哪些点不会被其他点挡住,只要顶点的坐标互质就可以了,互质用欧拉函数算。特殊考虑一下n=1和0的情况。
欧拉函数,Φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。φ(1)=1(唯一和1互质的数(小于等于1)就是1本身),代码中为了保持精度,式子应该要化简一下,
#include<cstdio> #include<iostream> using namespace std; typedef long long ll; const int maxn=40010; bool vis[maxn]; int prim[maxn],tot; int n; ll ans=0; double tmp=0; int main() { vis[1]=1; for(int i=2; i<=maxn; i++) { if(!vis[i]) { for(int j=i*2; j<maxn; j+=i) { vis[j]=1; } } } for(int i=1; i<=maxn-1; i++) { if(!vis[i])prim[++tot]=i; } cin>>n; if(n==0) { puts("0"); return 0; } if(n==1) { puts("1"); return 0; } n--; for(int i=1; i<=n; i++) { tmp=i; for(int j=1; j<=tot; j++) { if(i%prim[j]==0) { tmp=tmp*(prim[j]-1)/prim[j]; } else if(prim[j]>i)break; } ans+=tmp; } printf("%lld\n",ans*2+1); }
2190: [SDOI2008]仪仗队
Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 4138 Solved: 2760
[Submit][Status][Discuss]
Description
作为体育委员,C君负责这次运动会仪仗队的训练。仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是否整齐(如下图)。 现在,C君希望你告诉他队伍整齐时能看到的学生人数。
Input
共一个数N。
Output
共一个数,即C君应看到的学生人数。
Sample Input
4
Sample Output
9
HINT
【数据规模和约定】 对于 100% 的数据,1 ≤ N ≤ 40000
——愿为泰山而不骄
qq850874665~~