[SDOI2008]仪仗队

本文探讨了一个关于质数坐标可见性的有趣问题,并通过利用Euler's totient function(欧拉函数)找到一种有效的解决方法。该问题设定在一个网格上,从左下角出发,寻找所有能够被看到的格子,这些格子的坐标必须是质数。文章提供了一段C++代码,用于计算特定范围内所有有效坐标的数量。

题目链接

题目以左下角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 }
代码实现

 

转载于:https://www.cnblogs.com/OIerLYF/p/6923163.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值