博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ——2190: [SDOI2008]仪仗队
阅读量:7164 次
发布时间:2019-06-29

本文共 1193 字,大约阅读时间需要 3 分钟。

思路:

我们将其所在的位置设为(0,0),那么如果存在一个点(x,y,且有gcd(x,y)=k(k!=1),那么点(x/k,y/k)一定会将(x,y)挡住。而如果k=1,那么点(x,y)就一定会被看到。   这样就会想到这不是欧几里得吗??怎么跟欧拉函数扯上关系了???       

某位大佬跟我说你用欧几里得吧,把你T成狗。。。。。

好吧,我们就看一下正解吧。。。。。我们把这个题的式子列出来

n   n                                                              n    i     

∑  ∑  [gcd(i,j) = 1] + 2    将以上式子拆成两半等于  2(∑∑ [gcd(i,j)=1])+1  我们又可以知道 φ(i) =∑ j=1 [gcd(i,j) = 1]   所以就真的变成了裸地

 

i=1 j=1                                           i=1 j=1  

欧拉函数了。

代码:

#include
#include
#include
#include
#include
using namespace std;int n,ans,ans1;int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f;}int get_phi(int x){ int sum=x; if(x%2==0) { while(x%2==0) x/=2; sum/=2; } for(int i=3;i*i<=x;i+=2) { if(x%i==0) { while(x%i==0) x/=i; sum=sum/i*(i-1); } } if(x>1) sum=sum/x*(x-1); return sum;}int main(){ n=read();ans1=1; //枚举到n-1,因为我们把图劈成了两半,如果枚举到n的话, 对角线上的人数就加了两遍,所以我们不枚举到他,最后直接加1就好了 for(int i=2;i

 

转载于:https://www.cnblogs.com/z360/p/7300403.html

你可能感兴趣的文章