Logo 陈明玮的博客

博客

12754 Mathler 题解

2024-06-01 13:16:57 By 陈明玮

直接上代码!!!

#include <iostream>
using namespace std;
string ans[100005];
char lock[6];
long long cnt;

string from_int_to_string(long long x) {
    string a="";
    if(x==0) {
        return "0";
    }
    while(x) {
        a=(char)('0'+(x%10))+a;
        x/=10;
    }
    return a;
}
int main() {
    ios::sync_with_stdio(false);
    long long n;
    cin>>n;
    for(long long i=100000; i<=999999; i++) {
        if(i==n) {
            cnt++;
            ans[cnt]=from_int_to_string(n);
        }
    }
    for(long long i=0; i<10000; i++) {
        long long maxj=0;
        string is=from_int_to_string(i);
        if(is.size()==4) maxj=9;
        if(is.size()==3) maxj=99;
        if(is.size()==2) maxj=999;
        if(is.size()==1) maxj=9999;
        for(long long j=0; j<maxj; j++) {
            string js=from_int_to_string(j);
            if(is.size()+js.size()!=5) {
                continue;
            }
            if(i+j==n) {
                cnt++;
                ans[cnt]=is+"+"+js;
            }
            if(i-j==n) {
                cnt++;
                ans[cnt]=is+"-"+js;
            }
            if(i*j==n) {
                cnt++;
                ans[cnt]=is+"*"+js;
            }
            if(j!=0) {
                if(i%j==0) {
                    if(i/j==n) {
                        cnt++;
                        ans[cnt]=is+"/"+js;
                    }
                }
            }
        }
    }
    for(long long i=0; i<100; i++) {
        string is=from_int_to_string(i);
        long long maxj;
        if(is.size()==2) maxj=10;
        else maxj=100;
        for(long long j=0; j<maxj; j++) {
            string js=from_int_to_string(j);
            long long maxk;
            if(is.size()==2||js.size()==2) maxk=10;
            else maxk=100;
            for(long long k=0; k<100; k++) {
                string ks=from_int_to_string(k);
                if(is.size()+js.size()+ks.size()!=4) continue;
                if(i+j+k==n) {
                    cnt++;
                    ans[cnt]=is+"+"+js+"+"+ks;
                }
                if(i+j-k==n) {
                    cnt++;
                    ans[cnt]=is+"+"+js+"-"+ks;
                }
                if(i+j*k==n) {
                    cnt++;
                    ans[cnt]=is+"+"+js+"*"+ks;
                }
                if(k!=0) if(j%k==0)
                        if(i+j/k==n) {
                            cnt++;
                            ans[cnt]=is+"+"+js+"/"+ks;
                        }
                if(i-j+k==n) {
                    cnt++;
                    ans[cnt]=is+"-"+js+"+"+ks;
                }
                if(i-j-k==n) {
                    cnt++;
                    ans[cnt]=is+"-"+js+"-"+ks;
                }
                if(i-j*k==n) {
                    cnt++;
                    ans[cnt]=is+"-"+js+"*"+ks;
                }
                if(k!=0) if(j%k==0)
                        if(i-j/k==n) {
                            cnt++;
                            ans[cnt]=is+"-"+js+"/"+ks;
                        }
                if(i*j+k==n) {
                    cnt++;
                    ans[cnt]=is+"*"+js+"+"+ks;
                }
                if(i*j-k==n) {
                    cnt++;
                    ans[cnt]=is+"*"+js+"-"+ks;
                }
                if(i*j*k==n) {
                    cnt++;
                    ans[cnt]=is+"*"+js+"*"+ks;
                }
                if(k!=0) if((i*j)%k==0)
                        if(i*j/k==n) {
                            cnt++;
                            ans[cnt]=is+"*"+js+"/"+ks;
                        }
                if(j!=0) {
                    if(i%j==0)
                        if(i/j+k==n) {
                            cnt++;
                            ans[cnt]=is+"/"+js+"+"+ks;
                        }
                    if(i%j==0)
                        if(i/j-k==n) {
                            cnt++;
                            ans[cnt]=is+"/"+js+"-"+ks;
                        }
                    if((i*k)%j==0)
                        if(i*k/j==n) {
                            cnt++;
                            ans[cnt]=is+"/"+js+"*"+ks;
                        }
                    if(k!=0)
                        if(i%(j*k)==0)
                            if(i/j/k==n) {
                                cnt++;
                                ans[cnt]=is+"/"+js+"/"+ks;
                            }
                }
            }
        }
    }
    bool used[128];
    bool mst[128];
    for(long long i=0; i<127; i++) used[i]=mst[i]=0;
    for(long long i=1; i<=cnt; i++) {
        long long ok=1;
        bool tmp[128];
        for(long long j='0'; j<='9'; j++) tmp[j]=0;
        tmp['+']=tmp['-']=tmp['*']=tmp['/'];
        for(long long j=0; j<ans[i].size(); j++) {
            if(used[ans[i][j]]) {
                ok=0;
            }
            if(lock[j]) {
                if(ans[i][j]!=lock[j]) {
                    ok=0;
                }
            }
            tmp[ans[i][j]]=1;
        }
        for(long long j='0'; j<='9'; j++) if(mst[j]&&(!tmp[j])) ok=0;
        if(mst['+']&&(!tmp['+'])) ok=0;
        if(mst['-']&&(!tmp['-'])) ok=0;
        if(mst['*']&&(!tmp['*'])) ok=0;
        if(mst['/']&&(!tmp['/'])) ok=0;
        if(ok) {
            cout<<ans[i]<<endl;
            string t;
            cin>>t;
            for(long long j=0; j<ans[i].size(); j++) {
                if(t[j]=='X') {
                    used[ans[i][j]]=1;
                }
            }
            for(long long j=0; j<ans[i].size(); j++) {
                if(t[j]=='A'||t[j]=='B') {
                    used[ans[i][j]]=0;
                    mst[ans[i][j]]=1;
                }
                if(t[j]=='A') {
                    lock[j]=ans[i][j];
                }
            }
            if(t=="AAAAAA") {
                return 0;
            }
        }
    }
    return 0;
}

别数了,200行

今天上课时突发奇想,花了我一个小时才写出来

评论

陈明玮
@xushuoxin
Joker
from_int_to_string 可以改成STL内置函数to_string
陈珉宇

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。