#include <stdio.h>
#include <math.h> //sqrt()
/*
値nが与えられたときに次の条件を満たす数a,bを求め表示するプログラム
aとbの最小公倍数がn
a<bかつ(b-a)が最小
※正しい値を返さないことが判明
*/
void solve( int ) ;
int gcm( int , int ) ;
int main( ) {
//printf("[main]called\n\n");
solve( 360 ) ;
solve( 1000 ) ;
solve( 3000 ) ;
solve( 5040 ) ;
solve( 5400 ) ;
solve( 9000 ) ;
solve( 1088391168 ) ;
solve( 1338557220 ) ;
solve( 1000009961 ) ;
solve( 2000019922 ) ;
solve( 357912991 ) ;
solve( 2147477946 ) ;
solve( 2147483646 ) ;
solve( 2147483629 ) ;
solve( 13693680 ) ;
solve( 232792560 ) ;
solve( 2095502089 ) ;
solve( 2082117833 ) ;
}
void solve( int n) {
//printf("[solve]called\n");
printf ( "n = %d → " ,n) ;
// nが1の場合はn=a=b=1となり解なし
if ( n <= 1 ) {
printf ( "no answer\n " ) ;
return ;
}
/*
aとbを求めるにあたり、以下の値を仮定する
k :laとlbの最大公約数 nの約数のいずれか
la*lb=nとなる
la:a/kとなる数 nの約数のいずれか
lb:b/kとなる数 nの約数のいずれか
min_d:k*(lb-la)の最小値
*/
int a = 0 , b = 0 ;
int k , la , lb;
int min_d = n; //仮にnを設定。実際にはk=1,la=1,lb=nの時に最大となり必ず(n-1)以下の値で更新される
/*
まずnをla*lb=nとなるような2つの数la,lbに分解する
この時(lb-la)が出来るだけ小さくなるように√n未満からlaを探し出していく。
*/
la = ( int ) sqrt ( n) ;
//nが平方数(la^2=n)ならlaを-1する
if ( ( la* la) == n) {
la -- ;
}
do {
//laがnの約数ではない場合はスキップする
if ( ( n % la) == 0 ) {
lb = n / la ; //lbを設定
//laとlbの最大公約数を調べる。
k = gcm( la,lb) ;
//(lb-la)*kがmin_dを下回るならa,b,min_dの更新を行う
if ( ( ( lb - la) * k) <= min_d) {
//la,lbにそれぞれkを掛けた値をa,bとする
a = la * k ;
b = lb * k ;
min_d = ( lb - la) * k ;
}
}
la-- ; //laを減らす
} while ( la >= 1 ) ; //laの最小値は1
//最終的にa,bに格納された値を表示して終了する
printf ( "a = %d , b = %d\n " , a , b) ;
return ;
}
/*
gcm関数の定義
数値v1と数値v2の最大公約数を求める
*/
int gcm ( int v1 , int v2) {
//printf("[gcm]called v1=%d v2=%d",v1,v2);
//v1<=v2かを判定。
if ( v1 > v2) {
return gcm ( v2,v1) ;
}
int vt;
//v2%v1が0ならv1が最大公約数となる
while ( ( v2 % v1) ! = 0 ) {
//printf(" /v1=%d v2=%d",v1,v2);
//でなければv1←v2%v1 v2←v1として再計算
vt = v1 ;
v1 = v2 % v1 ;
v2 = vt ;
}
//printf(" /return %d\n",v1);
return v1 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+IC8vc3FydCgpCgovKgrlgKRu44GM5LiO44GI44KJ44KM44Gf44Go44GN44Gr5qyh44Gu5p2h5Lu244KS5rqA44Gf44GZ5pWwYSxi44KS5rGC44KB6KGo56S644GZ44KL44OX44Ot44Kw44Op44OgCuOAgGHjgahi44Gu5pyA5bCP5YWs5YCN5pWw44GMbgogIGE8YuOBi+OBpChiLWEp44GM5pyA5bCPCuKAu+ato+OBl+OBhOWApOOCkui/lOOBleOBquOBhOOBk+OBqOOBjOWIpOaYjgoqLwp2b2lkIHNvbHZlKGludCk7CmludCBnY20oaW50ICwgaW50KTsKCgppbnQgbWFpbigpewovL3ByaW50ZigiW21haW5dY2FsbGVkXG5cbiIpOwoJc29sdmUoICAgICAgIDM2MCk7IAoJc29sdmUoICAgICAgMTAwMCk7Cglzb2x2ZSggICAgICAzMDAwKTsKCXNvbHZlKCAgICAgIDUwNDApOwoJc29sdmUoICAgICAgNTQwMCk7Cglzb2x2ZSggICAgICA5MDAwKTsKCXNvbHZlKDEwODgzOTExNjgpOwoJc29sdmUoMTMzODU1NzIyMCk7Cglzb2x2ZSgxMDAwMDA5OTYxKTsKCXNvbHZlKDIwMDAwMTk5MjIpOwoJc29sdmUoIDM1NzkxMjk5MSk7Cglzb2x2ZSgyMTQ3NDc3OTQ2KTsKCXNvbHZlKDIxNDc0ODM2NDYpOwoJc29sdmUoMjE0NzQ4MzYyOSk7Cglzb2x2ZSggIDEzNjkzNjgwKTsKCXNvbHZlKCAyMzI3OTI1NjApOwoJc29sdmUoMjA5NTUwMjA4OSk7Cglzb2x2ZSgyMDgyMTE3ODMzKTsKfQoKdm9pZCBzb2x2ZShpbnQgbil7Ci8vcHJpbnRmKCJbc29sdmVdY2FsbGVkXG4iKTsKCXByaW50ZigibiA9ICVkIOKGkiAiLG4pOwoJLy8gbuOBjDHjga7loLTlkIjjga9uPWE9Yj0x44Go44Gq44KK6Kej44Gq44GXCglpZiAobiA8PSAxKXsKCQlwcmludGYoIm5vIGFuc3dlclxuIik7CgkJcmV0dXJuIDsKCX0KCQoJLyoKCWHjgahi44KS5rGC44KB44KL44Gr44GC44Gf44KK44CB5Lul5LiL44Gu5YCk44KS5Luu5a6a44GZ44KLCgnjgIBrIDpsYeOBqGxi44Gu5pyA5aSn5YWs57SE5pWw44CAbuOBrue0hOaVsOOBruOBhOOBmuOCjOOBiwoJ44CA44CAbGEqbGI9buOBqOOBquOCiwoJ44CAbGE6YS9r44Go44Gq44KL5pWw44CAbuOBrue0hOaVsOOBruOBhOOBmuOCjOOBiwoJ44CAbGI6Yi9r44Go44Gq44KL5pWw44CAbuOBrue0hOaVsOOBruOBhOOBmuOCjOOBiwoJ44CAbWluX2Q6ayoobGItbGEp44Gu5pyA5bCP5YCkCgkqLwoJaW50IGEgPSAwICwgYiA9IDAgOwoJaW50IGsgLCBsYSAsIGxiOwoJaW50IG1pbl9kID0gbjsgLy/ku67jgatu44KS6Kit5a6a44CC5a6f6Zqb44Gr44Gvaz0xLGxhPTEsbGI9buOBruaZguOBq+acgOWkp+OBqOOBquOCiuW/heOBmihuLTEp5Lul5LiL44Gu5YCk44Gn5pu05paw44GV44KM44KLCgkKCS8qCgnjgb7jgZpu44KSbGEqbGI9buOBqOOBquOCi+OCiOOBhuOBqu+8kuOBpOOBruaVsGxhLGxi44Gr5YiG6Kej44GZ44KLCgnjgZPjga7mmYIobGItbGEp44GM5Ye65p2l44KL44Gg44GR5bCP44GV44GP44Gq44KL44KI44GG44Gr4oiabuacqua6gOOBi+OCiWxh44KS5o6i44GX5Ye644GX44Gm44GE44GP44CCCgkqLwoJbGEgPSAoaW50KXNxcnQobik7CgkvL27jgYzlubPmlrnmlbAobGFeMj1uKeOBquOCiWxh44KSLTHjgZnjgosKCWlmICgobGEqbGEpID09IG4pIHsKCQlsYSAtLTsKCX0KCWRvIHsKCQkvL2xh44GMbuOBrue0hOaVsOOBp+OBr+OBquOBhOWgtOWQiOOBr+OCueOCreODg+ODl+OBmeOCiwoJCWlmKChuICUgbGEpID09IDApewoJCQlsYiA9IG4gLyBsYSA7IC8vbGLjgpLoqK3lrpoKCQkJCgkJCS8vbGHjgahsYuOBruacgOWkp+WFrOe0hOaVsOOCkuiqv+OBueOCi+OAggoJCQlrID0gZ2NtKGxhLGxiKTsKCQkJCgkJCS8vKGxiLWxhKSpr44GMbWluX2TjgpLkuIvlm57jgovjgarjgolhLGIsbWluX2Tjga7mm7TmlrDjgpLooYzjgYYKCQkJaWYgKCgobGIgLSBsYSkgKiBrKSA8PSBtaW5fZCkgewoJCQkJLy9sYSxsYuOBq+OBneOCjOOBnuOCjGvjgpLmjpvjgZHjgZ/lgKTjgpJhLGLjgajjgZnjgosKCQkJCWEgPSBsYSAqIGsgOwoJCQkJYiA9IGxiICogayA7CgkJCQltaW5fZCA9IChsYiAtIGxhKSAqIGsgOwoJCQl9CgkJfQoJCWxhLS0gOyAvL2xh44KS5rib44KJ44GZCgl9d2hpbGUobGEgPj0gMSk7IC8vbGHjga7mnIDlsI/lgKTjga8xCgkKCS8v5pyA57WC55qE44GrYSxi44Gr5qC857SN44GV44KM44Gf5YCk44KS6KGo56S644GX44Gm57WC5LqG44GZ44KLCglwcmludGYoImEgPSAlZCAsIGIgPSAlZFxuIiwgYSAsIGIpOwoJcmV0dXJuIDsKfQoKLyoKZ2Nt6Zai5pWw44Gu5a6a576pCuaVsOWApHYx44Go5pWw5YCkdjLjga7mnIDlpKflhazntITmlbDjgpLmsYLjgoHjgosKKi8KaW50IGdjbSAoaW50IHYxICwgaW50IHYyKXsKCQovL3ByaW50ZigiW2djbV1jYWxsZWQgdjE9JWQgdjI9JWQiLHYxLHYyKTsJCgkvL3YxPD12MuOBi+OCkuWIpOWumuOAggoJaWYgKHYxID4gdjIpIHsKCQlyZXR1cm4gZ2NtICh2Mix2MSk7Cgl9CglpbnQgdnQ7CgkKCS8vdjIldjHjgYww44Gq44KJdjHjgYzmnIDlpKflhazntITmlbDjgajjgarjgosKCXdoaWxlICgodjIgJSB2MSkgIT0gMCl7Ci8vcHJpbnRmKCIgL3YxPSVkIHYyPSVkIix2MSx2Mik7CgkJLy/jgafjgarjgZHjgozjgbB2MeKGkHYyJXYxIHYy4oaQdjHjgajjgZfjgablho3oqIjnrpcKCQl2dCA9IHYxIDsKCQl2MSA9IHYyICUgdjEgOwoJCXYyID0gdnQgOwoJfQovL3ByaW50ZigiIC9yZXR1cm4gJWRcbiIsdjEpOwoJcmV0dXJuIHYxIDsKfQo=
stdout
n = 360 → a = 36 , b = 40
n = 1000 → a = 125 , b = 200
n = 3000 → a = 500 , b = 600
n = 5040 → a = 140 , b = 144
n = 5400 → a = 216 , b = 225
n = 9000 → a = 72 , b = 125
n = 1088391168 → a = 165888 , b = 531441
n = 1338557220 → a = 109395 , b = 110124
n = 1000009961 → a = 1 , b = 1000009961
n = 2000019922 → a = 2 , b = 1000009961
n = 357912991 → a = 1 , b = 357912991
n = 2147477946 → a = 6 , b = 357912991
n = 2147483646 → a = 42966 , b = 49981
n = 2147483629 → a = 1 , b = 2147483629
n = 13693680 → a = 11088 , b = 11115
n = 232792560 → a = 14960 , b = 15561
n = 2095502089 → a = 1283 , b = 1633283
n = 2082117833 → a = 1289 , b = 1615297