POJ2773求互质数
http://poj.org/problem?id=2773
题意:给两个数m,k,问与m互质的第k个数是多少?
关键:如果a,b,两个数互质,记为(a,b),那么(b*k+a,b),k为非负整数。由此能推出如果1到m之间有j个与m互质的数,那么m,2*m之间也有j个互质的数,依次类推.例:假设m为10,1到10之间有1,3,7,9四个数与10互质,那么在10到20之间也有4个数与10互质,并且能知道这四个数是10*1+1,10*1+3,10*1+7,10*1+9,依次类推。
所以有AC代码:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn =1000010; int prime[maxn]; int gcd(int a,int b) { int t; if(a<b){t=a;a=b;b=t;} while(b) { t=a%b;a=b;b=t; } return a; } int main() { int m,k; while(scanf("%d%d",&m,&k)!=EOF) { int j=0; for(int i=1;i<=m;i++) if(gcd(m,i)==1) prime[++j]=i; if(k%j==0) printf("%d\n",m*(k/j-1)+prime[j]); else printf("%d\n",m*(k/j)+prime[k%j]); } }

浙公网安备 33010602011771号