Poj-2773 Happy 2006

本文介绍了一种利用欧几里得算法的性质,即gcd(b*t+a, b)=gcd(a, b),来快速找出与给定数m互质的第k个数的方法。通过观察到与m互质的数具有周期性,可以有效地计算出第k个互质数。代码使用了C++实现,并展示了如何通过模运算和gcd函数找到这些数。

[思路]:
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值