题目描述

分析:
求出与m互质的数中第k大的数
-
由欧几里德算法GCD(a, b)=GCD(b mod a, a),可以推出GCD(b, b×t+a)=GCD(a, b),其中t为任意整数。如果a与b互
素,则b×t+a与b也一定互素; -
与m互素的数对m取模具有周期性:如果小于m且 与m互素的数有j个,其中第i个是ai,则第m×j+i个与m互
素的数是m×j+ai。 -
首先,按升序求小于m,并和m互素的整数,并存入数组;然后根据这一数组,以及与m互素的数对m取模具有周期性,求出第K个与m互素的数
#include<iostream>
using namespace std;
int pri[1000000];
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main(){
int m,k;
while(cin>>m>>k){
int j=0;
for(int i=1;i<=m;i++){
if(gcd(m,i)==1)
pri[j++]=i;
}
if(k%j!=0)
cout<<k/j*m+pri[k%j-1]<<endl;
else
cout<<(k/j-1)*m+pri[j-1]<<endl;
}
}
求第K大互质数算法
本文介绍了一种高效算法,用于找出与给定数m互质的第k大的数。利用欧几里德算法原理及互质数的周期性特点,先构造一个包含所有小于m并与m互质的数的数组,再根据该数组计算目标值。

1166

被折叠的 条评论
为什么被折叠?



