Hack WA求助
查看原帖
Hack WA求助
156584
Magicpjl楼主2024/5/5 19:36

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;
}
2024/5/5 19:36
加载中...