【题解】[COCI2020-2021#2] Euklid

构造题。
来看这个东东:如果 h k ≤ b < h k + 1 h^k\leq b< h^{k+1} hkb<hk+1 , 那么 R ( b , h ) = h R(b, h) = h R(b,h)=h
构造这个东东:
b = g ⌈ h k g ⌉ a = h b + g b=g\lceil\frac{h^k}{g}\rceil \\ a=hb+g b=gghka=hb+g

其中 k k k 是 满足 h k > g h^k>g hk>g 的最小正整数。我们知道 g < h k ≤ b ≤ g ( h k g + 1 ) = h k + g < h k + 1 g<h^k\leq b\leq g(\frac{h^k}{g}+1)=h^k+g<h^{k+1} g<hkbg(ghk+1)=hk+g<hk+1 ( h ≥ 2 ) (h\geq 2) (h2)

我们有:

  1. g c d ( a , b ) = g c d ( h b + g , b ) = g c d ( g , b ) = g gcd(a,b)=gcd(hb+g,b)=gcd(g,b)=g gcd(a,b)=gcd(hb+g,b)=gcd(g,b)=g
  2. R ( a , b ) = R ( h b + g , b ) = R ( h , b ) = R ( b , h ) = h R(a,b)=R(hb+g,b)=R(h,b)=R(b,h)=h R(a,b)=R(hb+g,b)=R(h,b)=R(b,h)=h

根据 h k ≤ b < h k + 1 h^k\leq b< h^{k+1} hkb<hk+1 ,所以在经过 k k k 次后会成为 1 1 1

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll g,h;
int main() {
	int T; scanf("%d",&T); 
	while(T--) {
		scanf("%d%d",&g,&h);
		ll mul=h; while(mul<=g) mul*=h;
		ll a,b;
		printf("%lld %lld\n",a=h*b+g,b=((mul-1)/g+1)*g);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值