30分求调
查看原帖
30分求调
1386228
ydx202345楼主2025/7/23 11:15
#include<iostream>
#include<string>
using namespace std;
string mult(string sa, string sb) {
    int la = sa.size(), lb = sb.size();
    int lc = la + lb;
    int a[la], b[lb], c[lc];
    string sc;
    for(int i = 0; i < la; i++) a[la-i-1] = sa[i] - '0';
    for(int i = 0; i < lb; i++) b[lb-i-1] = sb[i] - '0';
    for(int i = 0; i < lc; i++) c[i] = 0;
    for(int i = 0; i < la; i++) {
        for(int j = 0; j < lb; j++) {
            c[i+j] += a[i] * b[j];
            if(c[i+j] > 9) {
                c[i+j+1] += c[i+j]/10;
                c[i+j] %= 10;
            }
        }
    }
    while(lc > 1 && c[lc-1] == 0)   lc--;
    for(int i = lc-1; i >= 0; i--) sc += c[i] + '0';
    return sc;
}
string add(string sa, string sb) {
    if (sa == "0") return sb;
    if (sb == "0") return sa;
    int la = sa.size(), lb = sb.size();
    int lc = max(la, lb) + 1;
    int a[la], b[lb], c[lc];
    for (int i = 0; i < lc; i++) c[i] = 0;
    for (int i = 0; i < la; i++) a[la-i-1] = sa[i] - '0';
    for (int i = 0; i < lb; i++) b[lb-i-1] = sb[i] - '0';
    for (int i = 0; i < lc; i++) {
        if (i < la) c[i] += a[i];
        if (i < lb) c[i] += b[i];
        if (c[i] >= 10) {
            c[i+1] += c[i] / 10;
            c[i] %= 10;
        }
    }
    string sc;
    int start = lc - 1;
    while (start > 0 && c[start] == 0) start--;
    for (int i = start; i >= 0; i--)    sc += (c[i] + '0');
    return sc;
}
string sub(string sa, string sb) {
    if (sa.size() < sb.size() || (sa.size() == sb.size() && sa < sb))   return "0";
    int la = sa.size(), lb = sb.size();
    int lc = la;
    int a[la], b[la], c[la+1];
    for (int i = 0; i < la; i++) a[la-i-1] = sa[i] - '0';
    for (int i = 0; i < lb; i++) b[lb-i-1] = sb[i] - '0';
    for (int i = lb; i < la; i++) b[i] = 0;
    for (int i = 0; i <= lc; i++) c[i] = 0;
    for (int i = 0; i < la; i++) {
        if (a[i] < b[i]) {
            a[i+1]--;
            a[i] += 10;
        }
        c[i] = a[i] - b[i];
    }
    while (lc > 0 && c[lc-1] == 0) lc--;
    if (lc == 0) return "0";
    string sc;
    for (int i = lc-1; i >= 0; i--) sc += (c[i] + '0');
    return sc;
}
string div(string sa, int b) {
    if(sa=="0") return "0";
    int la = sa.size();
    int kc=0;
    int a[la],c[la];
    string sc;
    for(int i = 0; i < la; i++) a[i] = sa[i] - '0';
    int x=0;
    for(int i = 0; i < la; i++) {
        c[i]=(x*10+a[i])/b;
        x=(x*10+a[i])%b;
    }
    while(c[kc] == 0)   kc++;
    for(int i = kc;i<la;i++) sc += c[i] + '0';
    return sc;
}
string quick_pow(string a,int b){
    string ans;
    ans="1";
    while(b>0){
        if(b%2) ans=mult(ans,a);
        a=mult(a,a);
        b/=2;
    }
    return ans;
}
bool str_cmp(string a, string b) {
    if(a.size() != b.size()) {
        return a.size() > b.size();
    }
    return a >= b;
}
string calc(string n,int b){
    string left="0",right=quick_pow("10",(n.size()+b-1)/b);
//    cout<<left<<' '<<right<<endl;
    string k=sub(right,left);
    int cnt=0;
    while(str_cmp(k,"1")){
        string mid=div(add(left,right),2),ans=quick_pow(mid,b);
        if(ans==n)   return mid;
        if(str_cmp(ans,n)) right=sub(mid,"1");
        else    left=add(left,"1");
        cnt++;
        k=sub(right,left);
    }
    return left;
}
int main(){
    string n;
    int b;
    cin>>b>>n;
    cout<<calc(n,b)<<endl;
    return 0;
}
2025/7/23 11:15
加载中...