二分 0pts 求助
查看原帖
二分 0pts 求助
780641
WD2c0mP楼主2023/1/5 16:30

0pts 求助(我用了二分)

#include<bits/stdc++.h>
#define ll long long
using namespace std;
string sn,sm;
ll n[11451],m[11451],check_use_ans[114514],ln,lm;
int calc(ll x){
    ll bb = x,cn = 0;
    while (bb) {
        cn ++;
        bb /= 10;
    }
    return cn;
}
bool cmp(ll la,ll lb){
	if (la != lb) return la > lb;
	for (int i = la;i >= 1;i --){
		if (n[i] != check_use_ans[i]) return n[i] > check_use_ans[i];
	}
	return 1;
}
bool check(ll mid){
    for (int i = 1;i <= lm;i ++){
        check_use_ans[i] = m[i] * mid;
    }
    int las = calc(mid) + lm + 3;
    for (int i = 1;i <= las;i ++){
		if (check_use_ans[i] > 9) {
			check_use_ans[i + 1] += check_use_ans[i] / 10;
			check_use_ans[i] %= 10;
		}
	}
	while (check_use_ans[las] == 0 && las > 1) las --;
	return cmp(ln,las);
}
int main(){
    cin >> sn >> sm;
    ln = sn.size(),lm = sm.size();
    for (int i = 1;i <= ln;i ++){
        n[i] = sn[ln - i] - '0';
    }
    for (int i = 1;i <= lm;i ++){
        m[i] = sm[lm - i] - '0';
    }
    ll l = 1,r = 11451419198101145,mid,ret;
    while (l <= r){
        mid = (l + r) >> 1;
        if (check(mid)) ret = mid,l = mid + 1;
        else r = mid - 1;
    }
    cout << ret << endl;
    return 0;
}
2023/1/5 16:30
加载中...