#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 :aとbの最大公約数 nの約数のいずれか
l :n/k
la:a/kとなる数
lb:b/kとなる数
la*lb=l、laとlbの最大公約数は1となる
min_d:k*(lb-la)の最小値
*/
int a = 0 , b = 0 ;
int k , l , la , lb;
int min_d = n; //仮にnを設定。実際にはk=1,la=1,lb=nの時に最大となり必ず(n-1)以下の値で更新される
//k=1(aとbの最大公約数1)を計算する
//printf("@k = 1\n");
k = 1 ;
l = n;
//laを√l(小数点以下切捨て)に設定
la = ( int ) sqrt ( l) ;
//lが平方数(la^2=l)ならlaを-1する
if ( la* la == l) {
la-- ;
}
do {
//printf("k=%d l=%d la=%d \n",k,l,la);
//laがlの約数ではない場合はスキップする
if ( ( l % la) == 0 ) {
lb = l / la; //lbを設定
//laとlbの最大公約数が1でなければスキップ
if ( gcm( la,lb) == 1 ) {
//(lb-la)*1(k)がmin_dを下回るならa,b,min_dの更新を行いループから抜ける
if ( ( lb - la) <= min_d) {
//printf("k=%d l=%d la=%d lb=%d\n",k,l,la,lb);
a = k * la ;
b = k * lb ;
min_d = ( lb - la) * k;
break ;
}
}
}
la-- ; //laを減らす
} while ( la >= 1 ) ; //laの最小値は1
//kが2以上の場合を計算する。カウンタとしてiを使用
int i = 2 ;
do {
//iがnの約数でない場合はスキップする
if ( ( n % i) == 0 ) {
//k = i と k = n / i の2つの場合をそれぞれ計算する
k = i;
l = n / k;
//laを√l(小数点以下切捨て)に設定
la = ( int ) sqrt ( l) ;
//lが平方数(la^2=l)ならlaを-1する
if ( la* la == l) {
la-- ;
}
//printf("i=%d k=%d l=%d la=%d\n",i,k,l,la);
do {
//laがlの約数ではない場合はスキップする
if ( ( l % la) == 0 ) {
lb = l / la; //lbを設定
//laとlbの最大公約数が1でなければスキップ
if ( gcm( la,lb) == 1 ) {
//(lb-la)*kがmin_dを下回るならa,b,min_dの更新を行いループから抜ける
if ( ( ( lb - la) * k) <= min_d) {
a = k * la ;
b = k * lb ;
min_d = ( lb - la) * k;
break ;
}
}
}
la-- ; //laを減らす
} while ( la >= 1 ) ; //laの最小値は1
k = n / i ;
//kがmin_dより大きければスキップ
if ( k <= min_d) {
l = n / k;
//laを√l(小数点以下切捨て)に設定
la = ( int ) sqrt ( l) ;
//lが平方数(la^2=l)ならlaを-1する
if ( la* la == l) {
la-- ;
}
//printf("i=%d k=%d l=%d la=%d\n",i,k,l,la);
do {
//laがlの約数ではない場合はスキップする
if ( ( l % la) == 0 ) {
lb = l / la; //lbを設定
//laとlbの最大公約数が1でなければスキップ
if ( gcm( la,lb) == 1 ) {
//(lb-la)*kがmin_dを下回るならa,b,min_dの更新を行いループから抜ける
if ( ( ( lb - la) * k) <= min_d) {
a = k * la ;
b = k * lb ;
min_d = ( lb - la) * k;
break ;
}
}
}
la-- ; //laを減らす
} while ( la >= 1 ) ; //laの最小値は1
}
}
i ++ ;
// }while((i * i) < n ); //i<√nまで計算 ←iが大きな値の場合桁あふれが発生
} while ( i < sqrt ( n) ) ; //i<√nまで計算
//nが平方数の場合はk=√nの場合があるのでこれを計算
if ( i* i == n) {
k = i ;
l = n / k ;
//laを√l(小数点以下切捨て)に設定
la = ( int ) sqrt ( l) ;
//lが平方数(la^2=l)ならlaを-1する
if ( la* la == l) {
la-- ;
}
do {
//laがlの約数ではない場合はスキップする
if ( ( l % la) == 0 ) {
lb = l / la; //lbを設定
//laとlbの最大公約数が1でなければスキップ
if ( gcm( la,lb) == 1 ) {
//(lb-la)*kがmin_dを下回るならa,b,min_dの更新を行いループから抜ける
if ( ( lb - la) <= min_d) {
a = k * la ;
b = k * lb ;
min_d = ( lb - la) ;
break ;
}
}
}
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+OBpChiLWEp44GM5pyA5bCPCiovCnZvaWQgc29sdmUoaW50KTsKaW50IGdjbShpbnQgLCBpbnQpOwoKCmludCBtYWluKCl7Ci8vcHJpbnRmKCJbbWFpbl1jYWxsZWRcblxuIik7Cglzb2x2ZSggICAgICAgMzYwKTsgCglzb2x2ZSggICAgICAxMDAwKTsKCXNvbHZlKCAgICAgIDMwMDApOwoJc29sdmUoICAgICAgNTA0MCk7Cglzb2x2ZSggICAgICA1NDAwKTsKCXNvbHZlKCAgICAgIDkwMDApOwoJc29sdmUoMTA4ODM5MTE2OCk7Cglzb2x2ZSgxMzM4NTU3MjIwKTsKCXNvbHZlKDEwMDAwMDk5NjEpOwoJc29sdmUoMjAwMDAxOTkyMik7Cglzb2x2ZSggMzU3OTEyOTkxKTsKCXNvbHZlKDIxNDc0Nzc5NDYpOwoJc29sdmUoMjE0NzQ4MzY0Nik7Cglzb2x2ZSgyMTQ3NDgzNjI5KTsKCXNvbHZlKCAgMTM2OTM2ODApOwoJc29sdmUoIDIzMjc5MjU2MCk7Cglzb2x2ZSgyMDk1NTAyMDg5KTsKCXNvbHZlKDIwODIxMTc4MzMpOwp9Cgp2b2lkIHNvbHZlKGludCBuKXsKLy9wcmludGYoIltzb2x2ZV1jYWxsZWRcbiIpOwoJcHJpbnRmKCJuID0gJWQg4oaSICIsbik7CgkvLyBu44GMMeOBruWgtOWQiOOBr249YT1iPTHjgajjgarjgorop6PjgarjgZcKCWlmIChuIDw9IDEpewoJCXByaW50Zigibm8gYW5zd2VyXG4iKTsKCQlyZXR1cm4gOwoJfQoJLyoKCWHjgahi44KS5rGC44KB44KL44Gr44GC44Gf44KK44CB5Lul5LiL44Gu5YCk44KS5Luu5a6a44GZ44KLCgnjgIBrIDph44GoYuOBruacgOWkp+WFrOe0hOaVsOOAgG7jga7ntITmlbDjga7jgYTjgZrjgozjgYsKCeOAgGwgOm4vawoJ44CAbGE6YS9r44Go44Gq44KL5pWwCgnjgIBsYjpiL2vjgajjgarjgovmlbAKCeOAgOOAgGxhKmxiPWzjgIFsYeOBqGxi44Gu5pyA5aSn5YWs57SE5pWw44GvMeOBqOOBquOCiwoJ44CAbWluX2Q6ayoobGItbGEp44Gu5pyA5bCP5YCkCgkqLwoJaW50IGEgPSAwICwgYiA9IDAgOwoJaW50IGsgLCBsICwgbGEgLCBsYjsKCWludCBtaW5fZCA9IG47IC8v5Luu44GrbuOCkuioreWumuOAguWun+mam+OBq+OBr2s9MSxsYT0xLGxiPW7jga7mmYLjgavmnIDlpKfjgajjgarjgorlv4XjgZoobi0xKeS7peS4i+OBruWApOOBp+abtOaWsOOBleOCjOOCiwoJCgkvL2s9MShh44GoYuOBruacgOWkp+WFrOe0hOaVsDEp44KS6KiI566X44GZ44KLCi8vcHJpbnRmKCJAayA9IDFcbiIpOwoJayA9IDE7CglsID0gbjsKCS8vbGHjgpLiiJpsKOWwj+aVsOeCueS7peS4i+WIh+aNqOOBpinjgavoqK3lrpoKCWxhID0gKGludClzcXJ0KGwpOwoJLy9s44GM5bmz5pa55pWwKGxhXjI9bCnjgarjgolsYeOCki0x44GZ44KLCglpZihsYSpsYSA9PSBsKXsKCQlsYS0tOwoJfQoJZG8gewovL3ByaW50Zigiaz0lZCBsPSVkIGxhPSVkIFxuIixrLGwsbGEpOwoJCS8vbGHjgYxs44Gu57SE5pWw44Gn44Gv44Gq44GE5aC05ZCI44Gv44K544Kt44OD44OX44GZ44KLCgkJaWYoKGwgJSBsYSkgPT0gMCApewoJCQlsYiA9IGwgLyBsYTsgIC8vbGLjgpLoqK3lrpoKCQkJLy9sYeOBqGxi44Gu5pyA5aSn5YWs57SE5pWw44GMMeOBp+OBquOBkeOCjOOBsOOCueOCreODg+ODlwoJCQlpZiAoZ2NtKGxhLGxiKSA9PSAxKXsKCQkJCS8vKGxiLWxhKSoxKGsp44GMbWluX2TjgpLkuIvlm57jgovjgarjgolhLGIsbWluX2Tjga7mm7TmlrDjgpLooYzjgYTjg6vjg7zjg5fjgYvjgonmipzjgZHjgosKCQkJCWlmICgobGIgLSBsYSk8PSBtaW5fZCkgewovL3ByaW50Zigiaz0lZCBsPSVkIGxhPSVkIGxiPSVkXG4iLGssbCxsYSxsYik7CgkJCQkJYSA9IGsgKiBsYSA7CgkJCQkJYiA9IGsgKiBsYiA7CgkJCQkJbWluX2QgPSAobGIgLSBsYSkqazsKCQkJCQlicmVhayA7CgkJCQl9CgkJCX0KCQl9CgkJbGEtLSA7IC8vbGHjgpLmuJvjgonjgZkKCX13aGlsZShsYSA+PSAxKTsgLy9sYeOBruacgOWwj+WApOOBrzEKCQoJLy9r44GMMuS7peS4iuOBruWgtOWQiOOCkuioiOeul+OBmeOCi+OAguOCq+OCpuODs+OCv+OBqOOBl+OBpmnjgpLkvb/nlKgKCWludCBpID0gMjsKCWRvIHsKCQkvL2njgYxu44Gu57SE5pWw44Gn44Gq44GE5aC05ZCI44Gv44K544Kt44OD44OX44GZ44KLCgkJaWYgKChuICUgaSkgPT0gMCkgewoJCQkvL2sgPSBpIOOBqCBrID0gbiAvIGkg44Gu77yS44Gk44Gu5aC05ZCI44KS44Gd44KM44Ge44KM6KiI566X44GZ44KLCgkJCWsgPSBpOwoJCQlsID0gbiAvIGs7CgkJCS8vbGHjgpLiiJpsKOWwj+aVsOeCueS7peS4i+WIh+aNqOOBpinjgavoqK3lrpoKCQkJbGEgPSAoaW50KXNxcnQobCk7CgkJCS8vbOOBjOW5s+aWueaVsChsYV4yPWwp44Gq44KJbGHjgpItMeOBmeOCiwoJCQlpZihsYSpsYSA9PSBsKXsKCQkJCWxhLS07CgkJCX0KLy9wcmludGYoImk9JWQgaz0lZCBsPSVkIGxhPSVkXG4iLGksayxsLGxhKTsKCQkJZG8gewoJCQkJLy9sYeOBjGzjga7ntITmlbDjgafjga/jgarjgYTloLTlkIjjga/jgrnjgq3jg4Pjg5fjgZnjgosKCQkJCWlmKChsICUgbGEpID09IDAgKXsKCQkJCQlsYiA9IGwgLyBsYTsgIC8vbGLjgpLoqK3lrpoKCQkJCQkvL2xh44GobGLjga7mnIDlpKflhazntITmlbDjgYwx44Gn44Gq44GR44KM44Gw44K544Kt44OD44OXCgkJCQkJaWYgKGdjbShsYSxsYikgPT0gMSl7CgkJCQkJCS8vKGxiLWxhKSpr44GMbWluX2TjgpLkuIvlm57jgovjgarjgolhLGIsbWluX2Tjga7mm7TmlrDjgpLooYzjgYTjg6vjg7zjg5fjgYvjgonmipzjgZHjgosKCQkJCQkJaWYgKCgobGIgLSBsYSkqayk8PSBtaW5fZCkgewoJCQkJCQkJYSA9IGsgKiBsYSA7CgkJCQkJCQliID0gayAqIGxiIDsKCQkJCQkJCW1pbl9kID0gKGxiIC0gbGEpKms7CgkJCQkJCQlicmVhayA7CgkJCQkJCX0KCQkJCQl9CgkJCQl9CgkJCQlsYS0tIDsgLy9sYeOCkua4m+OCieOBmQoJCQl9d2hpbGUobGEgPj0gMSk7IC8vbGHjga7mnIDlsI/lgKTjga8xCgkJCQoJCQlrID0gbiAvIGkgOwoJCQkvL2vjgYxtaW5fZOOCiOOCiuWkp+OBjeOBkeOCjOOBsOOCueOCreODg+ODlwoJCQlpZiAoayA8PSBtaW5fZCl7CgkJCQlsID0gbiAvIGs7CgkJCQkvL2xh44KS4oiabCjlsI/mlbDngrnku6XkuIvliIfmjajjgaYp44Gr6Kit5a6aCgkJCQlsYSA9IChpbnQpc3FydChsKTsKCQkJCS8vbOOBjOW5s+aWueaVsChsYV4yPWwp44Gq44KJbGHjgpItMeOBmeOCiwoJCQkJaWYobGEqbGEgPT0gbCl7CgkJCQkJbGEtLTsKCQkJCX0KLy9wcmludGYoImk9JWQgaz0lZCBsPSVkIGxhPSVkXG4iLGksayxsLGxhKTsKCQkJCWRvIHsKCQkJCQkvL2xh44GMbOOBrue0hOaVsOOBp+OBr+OBquOBhOWgtOWQiOOBr+OCueOCreODg+ODl+OBmeOCiwoJCQkJCWlmKChsICUgbGEpID09IDAgKXsKCQkJCQkJbGIgPSBsIC8gbGE7ICAvL2xi44KS6Kit5a6aCgkJCQkJCS8vbGHjgahsYuOBruacgOWkp+WFrOe0hOaVsOOBjDHjgafjgarjgZHjgozjgbDjgrnjgq3jg4Pjg5cKCQkJCQkJaWYgKGdjbShsYSxsYikgPT0gMSl7CgkJCQkJCQkvLyhsYi1sYSkqa+OBjG1pbl9k44KS5LiL5Zue44KL44Gq44KJYSxiLG1pbl9k44Gu5pu05paw44KS6KGM44GE44Or44O844OX44GL44KJ5oqc44GR44KLCgkJCQkJCQlpZiAoKChsYiAtIGxhKSprKTw9IG1pbl9kKSB7CgkJCQkJCQkJYSA9IGsgKiBsYSA7CgkJCQkJCQkJYiA9IGsgKiBsYiA7CgkJCQkJCQkJbWluX2QgPSAobGIgLSBsYSkqazsKCQkJCQkJCQlicmVhayA7CgkJCQkJCQl9CgkJCQkJCX0KCQkJCQl9CgkJCQkJbGEtLSA7IC8vbGHjgpLmuJvjgonjgZkKCQkJCX13aGlsZShsYSA+PSAxKTsgLy9sYeOBruacgOWwj+WApOOBrzEKCQkJfQoJCX0KCQlpICsrIDsKLy8JfXdoaWxlKChpICogaSkgPCBuICk7IC8vaTziiJpu44G+44Gn6KiI566XICDihpBp44GM5aSn44GN44Gq5YCk44Gu5aC05ZCI5qGB44GC44G144KM44GM55m655SfCgl9d2hpbGUoaSA8IHNxcnQobikgKTsgLy9pPOKImm7jgb7jgafoqIjnrpcKCQoJLy9u44GM5bmz5pa55pWw44Gu5aC05ZCI44Gvaz3iiJpu44Gu5aC05ZCI44GM44GC44KL44Gu44Gn44GT44KM44KS6KiI566XCglpZiAoaSppID09IG4pewoJCWsgPSBpIDsKCQlsID0gbiAvIGsgOwoJCS8vbGHjgpLiiJpsKOWwj+aVsOeCueS7peS4i+WIh+aNqOOBpinjgavoqK3lrpoKCQlsYSA9IChpbnQpc3FydChsKTsKCQkvL2zjgYzlubPmlrnmlbAobGFeMj1sKeOBquOCiWxh44KSLTHjgZnjgosKCQlpZihsYSpsYSA9PSBsKXsKCQkJbGEtLTsKCQl9CgkJZG8gewoJCQkvL2xh44GMbOOBrue0hOaVsOOBp+OBr+OBquOBhOWgtOWQiOOBr+OCueOCreODg+ODl+OBmeOCiwoJCQlpZigobCAlIGxhKSA9PSAwICl7CgkJCQlsYiA9IGwgLyBsYTsgIC8vbGLjgpLoqK3lrpoKCQkJCS8vbGHjgahsYuOBruacgOWkp+WFrOe0hOaVsOOBjDHjgafjgarjgZHjgozjgbDjgrnjgq3jg4Pjg5cKCQkJCWlmIChnY20obGEsbGIpID09IDEpewoJCQkJCS8vKGxiLWxhKSpr44GMbWluX2TjgpLkuIvlm57jgovjgarjgolhLGIsbWluX2Tjga7mm7TmlrDjgpLooYzjgYTjg6vjg7zjg5fjgYvjgonmipzjgZHjgosKCQkJCQlpZiAoKGxiIC0gbGEpPD0gbWluX2QpIHsKCQkJCQkJYSA9IGsgKiBsYSA7CgkJCQkJCWIgPSBrICogbGIgOwoJCQkJCQltaW5fZCA9IChsYiAtIGxhKTsKCQkJCQkJYnJlYWsgOwoJCQkJCX0KCQkJCX0KCQkJfQoJCQlsYS0tIDsgLy9sYeOCkua4m+OCieOBmQoJCX13aGlsZShsYSA+PSAxKTsgLy9sYeOBruacgOWwj+WApOOBrzEKCQkKCX0KCQoJLy/mnIDntYLnmoTjgathLGLjgavmoLzntI3jgZXjgozjgZ/lgKTjgpLooajnpLrjgZfjgabntYLkuobjgZnjgosKCXByaW50ZigiYSA9ICVkICwgYiA9ICVkXG4iLCBhICwgYik7CglyZXR1cm4gOwp9CgovKgpnY23plqLmlbDjga7lrprnvqkK5pWw5YCkdjHjgajmlbDlgKR2MuOBruacgOWkp+WFrOe0hOaVsOOCkuaxguOCgeOCiwoqLwppbnQgZ2NtIChpbnQgdjEgLCBpbnQgdjIpewoJCi8vcHJpbnRmKCJbZ2NtXWNhbGxlZCB2MT0lZCB2Mj0lZCIsdjEsdjIpOwkKCS8vdjE8PXYy44GL44KS5Yik5a6a44CCCglpZiAodjEgPiB2MikgewoJCXJldHVybiBnY20gKHYyLHYxKTsKCX0KCWludCB2dDsKCQoJLy92MiV2MeOBjDDjgarjgol2MeOBjOacgOWkp+WFrOe0hOaVsOOBqOOBquOCiwoJd2hpbGUgKCh2MiAlIHYxKSAhPSAwKXsKLy9wcmludGYoIiAvdjE9JWQgdjI9JWQiLHYxLHYyKTsKCQkvL+OBp+OBquOBkeOCjOOBsHYx4oaQdjIldjEgdjLihpB2MeOBqOOBl+OBpuWGjeioiOeulwoJCXZ0ID0gdjEgOwoJCXYxID0gdjIgJSB2MSA7CgkJdjIgPSB2dCA7Cgl9Ci8vcHJpbnRmKCIgL3JldHVybiAlZFxuIix2MSk7CglyZXR1cm4gdjEgOwp9Cg==