题目大意就是给出n和k求出第k个与n互素的数
如果知道欧几里德算法的话就应该知道gcd(b×t+a,b)=gcd(a,b) (t为任意整数)
则如果a与b互素,则b×t+a与b也一定互素,如果a与b不互素,则b×t+a与b也一定不互素
故与m互素的数对m取模具有周期性,则根据这个方法我们就可以很快的求出第k个与m互素的数
假设小于m的数且与m互素的数有k个,其中第i个是ai,则第m×k+i与m互素的数是k×m+ai
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = 1000000 + 100;
#define INF 0x3f3f3f3f
#define clr(x,y) memset(x,y,sizeof x )
typedef long long ll;
#define eps 10e-10
const int Mod = 1000000007;
typedef pair<ll, ll> P;
int gcd(int x,int y)
{
return y ? gcd(y,x % y) : x;
}
int ps[maxn];
int main()
{
int n,k;
while( ~ scanf("%d%d",&n,&k))
{
int len = 0;
for(int i = 1; i <= n; i ++)
{
if(gcd(n,i) == 1)
ps[len ++] = i;
}
if(k <= len)
{
printf("%d\n",ps[k - 1]);
continue;
}
int t = k / len,ts = k % len;
printf("%d\n",ts ? (t * n + ps[ts - 1]) : ((t - 1) * n + ps[len - 1]));
}
return 0;
}