RT,hack数据输出2 9 26 3508 15786 45604
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
int m, n;
int cnt = 2;
int ch[100], ans[100], ax, newm, newn, g;
int gcd(int a, int b){
return (!b) ? a : gcd(b , (a % b));
}
void ids(int now, int m, int n){
if(now == cnt+1){
if(m != 0) return;
//cout<<ch[cnt]<<" "<<ans[cnt]<<endl;
if(ans[1] == 0 || ch[cnt] < ans[cnt]){
for(int i=1; i<=cnt; i++){
ans[i] = ch[i];
}
//cout<<ch[cnt]<<" "<<ans[cnt]<<endl;
}
return;
}
if(now == cnt){
if((m == 1) && (n <= ax) && (n > ch[now-1])){
ch[now] = n;
ids(now+1, 0, n);
}
return;
}
if(now == cnt - 1){
for(int z = 4*n/m/m; z <= min(2*ax/m, ax*ax/n); z++){
int delta = m*m*z*z - 4*n*z;
int sq = sqrt(delta);
if((sq * sq == delta) && (m*z-sq > 0) && (!((m*z-sq) % 2))){
int nm = m*z+sq;
int nn = 2*n*z;
int ng = gcd(nm, nn);
nn /= ng;
ch[now] = nn;
//cout<<nm<<" ";
newm = m*z-sq;
newn = 2*n*z;;
//cout<<newm<<" "<<newn<<" ";
g = gcd(newm, newn);
newn /= g;
//cout<<newm<<" ";
ids(now+1, 1, newn);
}
}
return;
}
for(int i = max(n/m+1, ch[now-1]+1); i<=min(ax, (cnt - now) * n / (m-1)); i++){
ch[now] = i;
newm = m * i - n;
newn = n * i;
if(newm){
g = gcd(newm, newn);
newm /= g;
newn /= g;
//cout<<ch[now]<<" "<<newm<<" "<<newn<<endl;
ids(now+1, newm, newn);
}
}
}
signed main(){
cin>>m>>n;
memset(ch, 0, sizeof(ch));
memset(ans, 0, sizeof(ans));
g = gcd(m, n);
m /= g;
n /= g;
if(m == 1){
cout<<n;
return 0;
}
// if(m==570&&n==877) {
// printf("2 7 144 15786 18417 42096");
// return 0;
// }
while(1){
ans[cnt] = 1e9;
ax = 1000;
while(ax <= 1e7){
ids(1, m, n);
if(ans[1] != 0){
for(int i=1; i<=cnt; i++) cout<<ans[i]<<" ";
return 0;
}
ax *= 10;
}
cnt++;
}
return 0;
}