P1592 互质 题解
题目链接
题目描述
输入两个正整数 n n n 和 k k k,求与 n n n 互质的第 k k k 个正整数。
数据规模与约定
对于所有的数据,保证 1 ≤ n ≤ 1 0 6 1 \leq n \le 10^6 1≤n≤106, 1 ≤ k ≤ 1 0 8 1 \leq k\le 10^8 1≤k≤108。
solution
1.1
对于任意 a a a,与 n n n 互质当且仅当 g c d ( a , n ) = 1 gcd(a,n)=1 gcd(a,n)=1 ,则 g c d ( n , a % n ) = 1 gcd(n,a\%n)=1 gcd(n,a%n)=1
证明1:
若
g
c
d
(
n
,
a
%
n
)
=
b
(
b
≠
1
)
b
∣
a
%
n
,
b
∣
n
∴
n
=
k
1
b
,
a
%
n
=
k
2
b
∴
a
=
q
n
+
a
%
n
=
q
k
1
b
+
k
2
b
=
(
q
k
1
+
k
2
)
b
∴
b
∣
g
c
d
(
a
,
n
)
又
g
c
d
(
a
,
n
)
=
1
∴
b
=
1
若\ gcd(n,a\%n)=b(b\not= 1)\\ b|a\%n,b|n\\ \therefore n=k_1b,a\%n=k_2b\\ \therefore a=qn+a\%n=qk_1b+k_2b=(qk_1+k_2)b\\ \therefore b|gcd(a,n)\\ 又\ gcd(a,n)=1\\ \therefore b=1
若 gcd(n,a%n)=b(b=1)b∣a%n,b∣n∴n=k1b,a%n=k2b∴a=qn+a%n=qk1b+k2b=(qk1+k2)b∴b∣gcd(a,n)又 gcd(a,n)=1∴b=1
证明2:
欧几里得算法部分证明
1.2
由上述证明,对于任意 a a a,我们可以将其转化为 a % n a\%n a%n,则只用枚举小于 n n n 的正整数中与 n n n 互质的,计算循环即可
2.1 示例代码
#include<bits/stdc++.h>
#define ll long long
#define N 1000005
#define inf 1000000007
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fd(i,a,b) for(int i=a;i>=b;--i)
using namespace std;
int n,k,nm[N],cnt;
int read(){
int res=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-'&&((ch=getchar())>='0'&&(ch)<='9')) f=-1;
else ch=getchar();
}
while(ch>='0'&&ch<='9')res=res*10+ch-'0',ch=getchar();
return res*f;
}
int main(){
n=read(),k=read();
fo(i,1,n){
if(__gcd(n,i)==1)nm[++cnt]=i;
}
printf("%lld",1ll*n*((k/cnt))+nm[k%cnt]);
}