P1592 互质 题解

P1592 互质 题解

题目链接

P1592

题目描述

输入两个正整数 n n n k k k,求与 n n n 互质的第 k k k 个正整数。

数据规模与约定

对于所有的数据,保证 1 ≤ n ≤ 1 0 6 1 \leq n \le 10^6 1n106 1 ≤ k ≤ 1 0 8 1 \leq k\le 10^8 1k108

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)ba%n,bnn=k1b,a%n=k2ba=qn+a%n=qk1b+k2b=(qk1+k2)bbgcd(a,n) gcd(a,n)=1b=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]);
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值