题意:给出m和k,求与m互质的第k个数
要注意的是k可以大于m,之前没考虑到这一点
思路:要求第K个数,我们可以观察到gcd(a,b)==gcd(a%b,b),那我们可以推出gcd(a+b,b)==gcd(a,b)!!!
因为(a+b)%b==a%b~~ 也就是说,当求出了1~m间与m互质的数之后,把这些数加上m就可以得到m~2m间的与m互质的数。而且m~2m间不会有某个与m互质的数被漏掉。
如果存素数时从下标1开始村,那么若k%num==0的话就必须是prime[num],但是求出的是prime[0],需要特判,为了不那么麻烦,我们采用从下标0开始,k也是
代码:
#include <stdio.h>//一般不用考虑余数==0时要改变一些策略,最好变成从下标0开始
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int prime[1000005];
int gcd(int a,int b)
{
if(b==0)return a;
return gcd(b,a%b);
}
int main()
{
int m,k,num;
while(scanf("%d%d",&m,&k)!=EOF)
{
memset(prime,0,sizeof(prime));
num=0;
for(int i=1;i<=m;i++)
{
if(gcd(m,i)==1)
prime[num++]=i;
}
k--;
printf("%I64d\n",prime[k%num]+k/num*(long long )m);
}
return 0;
}