【题解】[COCI2020-2021#2] Euklid
构造题。
 来看这个东东:如果  
     
      
       
        
        
          h 
         
        
          k 
         
        
       
         ≤ 
        
       
         b 
        
       
         < 
        
        
        
          h 
         
         
         
           k 
          
         
           + 
          
         
           1 
          
         
        
       
      
        h^k\leq b< h^{k+1} 
       
      
    hk≤b<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=g⌈ghk⌉a=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<hk≤b≤g(ghk+1)=hk+g<hk+1 ( h ≥ 2 ) (h\geq 2) (h≥2) 。
我们有:
- 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 。
- 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} hk≤b<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);
	}
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号