第k个互质数
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
4
-
描述
-
两个数的a,b的gcd为1,即a,b互质,现在给你一个数m,你知道与它互质的第k个数是多少吗?与m互质的数按照升序排列。
-
输入
- 输入m ,k (1<=m<=1000000;1<=k<=100000000) 输出
- 输出第k个数。 样例输入
-
10 1 10 2 10 3
样例输出
-
1 3 7
上传者
-
TC_常红立
ac代码
#include<stdio.h> #include<string.h> #include<math.h> int cot,a[10100],q[1010000]; int n,k; void fun(int n) { int i; cot=0; for(i=2;i*i<=n;i++) { if(n%i==0) { a[++cot]=i; while(n%i==0) n/=i; } } if(n>1) a[++cot]=n; } int count(int n,int m) { int sum=n,x=0; int i,j; q[++x]=1; for(i=1;i<=cot;i++) { int tx=x; for(j=1;j<=x;j++) { q[++tx]=q[j]*a[i]*-1; sum+=n/q[tx]; } x=tx; } return sum; } int bs() { int l=1,r=2000000010,mid; while(l<=r) { mid=(l+r)/2; if(count(mid,n)>=k) r=mid-1; else l=mid+1; } return l; } int main() { //int n,k; while(scanf("%d%d",&n,&k)!=EOF) { fun(n); int ans=bs(); printf("%d\n",ans); } }