首页 > 代码库 > [SDOI2008]仪仗队

[SDOI2008]仪仗队

题目链接

题目以左下角C君为0,0点 会发现C君能看到的人横纵坐标都是质数(不会证明,强行找规律),还有一点就是对称性,可以看到(2,1)点那么必然能看到(1,2)点。

那么结论就出来了:

1 -> n-1之间与phi值加和*2+1

技术分享
 1 #include <cstdio> 2 using namespace std; 3 int x,phi[100005],ans=1; 4 void phi_table(int n,int *phi)   5 {   6     for(int i=2;i<=n;i++)  phi[i]=0;   //初始化  7     phi[1]=1;   8     for(int i=2;i<=n;i++)   9     {  10         if(!phi[i])   11         for(int j=i;j<=n;j+=i)  12         {  13             if(!phi[j])  phi[j]=j;  14             phi[j]=phi[j]/i*(i-1);  15         }  16         ans+=phi[i];  //加和 17     }   18 }19 int main(){20     scanf("%d",&x);21     if(x==1){22         printf("0");23     }24     else {25     phi_table(x-1,phi);26     printf("%d",ans*2+1);27     }28     return 0;29 }
代码实现

 

[SDOI2008]仪仗队