luogu P1592 互质(欧拉函数)

题意

(n<=106,k<=108)

题解

一开始以为是搜索。

但想想不对,翻了一眼题解发现是欧拉函数。

因为

gcd(a,b)=gcd(a,a+b)

所以和n互质的数应该是类似a1,a2.....ax,a1+n,a2+n.....ax+n......这样的。

所以就可以瞎搞了。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int n,d,phi,c[1500000],tmp,ans,cnt;
 8 int gcd(int x,int y){
 9     if(x==0)return y;
10     if(y==0)return x;
11     return gcd(y,x%y);
12 }
13 void get_phi(){
14     for(int i=1;i<=n;i++){
15         if(gcd(i,n)==1){
16             phi++;
17             c[++cnt]=i;
18         }
19     }
20 }
21 int main(){
22     scanf("%d%d",&n,&d);
23     get_phi();
24     tmp=(d-1)/phi;
25     ans=(d-1)%phi+1;
26     printf("%d",c[ans]+tmp*n);
27     return 0;
28 }

 

posted @ 2018-09-01 09:17  Xu-daxia  阅读(176)  评论(0编辑  收藏  举报