P2158 [SDOI2008] 仪仗队
题目大意:
solution:
先得出结论:当 \(\gcd(x,y)=1\) 时两个点不可见,换句话说,就是两个点互质(0,1特殊考虑)。
简单证明:
反证法:
设 \(x,y\) 所在直线斜率为 \(k=\frac{y}{x}\) \(\gcd(x,y)=d\) ,假设 \(x,y\) 不互质,设 \(x'=x/d,y'=y/d\) ,易证 \(\frac{y'}{x'}\) 也是等于 \(k\) 的,所以假设不成立。 \(x,y\) 互质。
证毕。
问题就转化为求 \(\sum ^n _{i=1} \varphi(n)\) ,不过还得一些处理。
细节处理:
- 想好多算或者少算的地方。
代码
#include<cstdio>
using namespace std;
const int N=1005;
int phi[N],pr[N],cnt;
int pre[N];
inline void xxs(){
phi[1]=1;
for(int i=2;i<=1000;i++){
if(!phi[i]) pr[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt;j++){
if(i*pr[j]>1000) break;
if(i%pr[j]==0)
phi[i*pr[j]]=phi[i]*pr[j];
else
phi[i*pr[j]]=phi[i]*(pr[j]-1);
}
}
for(int i=1;i<=1000;i++)
pre[i]=pre[i-1]+phi[i];
}
int main(){
xxs();
int T,t=0; scanf("%d",&T);
while(T--){
++t;
int n; scanf("%d",&n);
printf("%d %d %d\n",t,n,pre[n]*2+1);
}
return 0;
}