您的位置:首页 > 其它

poj 2773欧几里得的应用

2017-05-23 15:14 120 查看
题目大意就是给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: