Poj-2773 Happy 2006

版权声明:最后一年,加油~ https://blog.csdn.net/zzti_xiaowei/article/details/86712091

[思路]:
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<algorithm>
using namespace std;
typedef long long ll;
const int Max_n=1e6+10;

int m,k;
int v[Max_n],ans;

int gcd(int a,int b){
    if(b==0)return a;
    return gcd(b,a%b);
}

int main()
{
    while(~scanf("%d%d",&m,&k)){
        ans=0;
        // 1 1 RE
        for(int i=1;i<=m;i++){
            if(gcd(i,m)==1)v[ans++]=i;
        }
        if(k%ans==0)printf("%d\n",(k/ans-1)*m+v[ans-1]);
        else printf("%d\n",k/ans*m+v[k%ans-1]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zzti_xiaowei/article/details/86712091
今日推荐