高精度求调
查看原帖
高精度求调
1287451
MuktorFM楼主2025/7/21 10:20

最后一篇题解思路,65 pts

#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace BIGINT{
    int a[10005],b[10005],c[10005];
    string jia(string s1,string s2){
    	if(s1 == "0" && s2 == "0") return "0";
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        memset(c,0,sizeof c);
    	int l1 = s1.size(),l2 = s2.size();
    	for(int i = 0;i < l1;i++) a[l1 - i - 1] = s1[i] - '0';
    	for(int i = 0;i < l2;i++) b[l2 - i - 1] = s2[i] - '0';
    	int l = max(l1,l2);
    	for(int i = 0;i < l;i++){
    		c[i] += a[i] + b[i];
    		if(c[i] >= 10){
    			c[i] %= 10;
    			c[i + 1]++;
    		}
    	}
    	while(c[l] == 0) l--;
    	string ans = "";
    	for(int i = l;i >= 0;i--) ans += c[i] + '0';
    	return ans;
    }
    string jian(string s1,string s2){
    	memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        memset(c,0,sizeof c);
        string ans = "";
        if(s1.size() == s2.size()){
            if(s2 > s1){
                ans += "-";
                swap(s1,s2);
            }
        }else{
            if(s1.size() < s2.size()){
                ans += "-";
                swap(s1,s2);
            }
        }
        int l1 = s1.size(),l2 = s2.size(),l = max(l1,l2);
        for(int i = 0;i < l1;i++) a[i] = s1[l1 - i - 1] - '0';
        for(int i = 0;i < l2;i++) b[i] = s2[l2 - i - 1] - '0';
        for(int i = 0;i < l;i++){
            c[i] = a[i] - b[i];
            if(c[i] < 0){
                a[i + 1]--;
                c[i] += 10;
            }
        }
        while(c[l] == 0 && l >= 1) l--;
    	for(int i = l;i >= 0;i--) ans += c[i] + '0';
    	return ans;
	}
    string cheng(string s1,string s2){
    	if(s1 == "0" || s2 == "0") return "0";
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        memset(c,0,sizeof c);
    	int l1 = s1.size(),l2 = s2.size();
    	for(int i = 0;i < l1;i++) a[i] = s1[l1 - i - 1] - '0';
    	for(int i = 0;i < l2;i++) b[i] = s2[l2 - i - 1] - '0';
    	for(int i = 0;i < l1;i++){
        	for(int j = 0;j < l2;j++){
            	c[i + j] += a[i] * b[j];
            	if(c[i + j] >= 10){
                	c[i + j + 1] += c[i + j] / 10;
                	c[i + j] %= 10;
            	}
        	}
    	}
    	int l = l1 + l2;
    	while(c[l] == 0 && l > 1) l--;
    	string ans = "";
    	for(int i = l;i >= 0;i--) ans += c[i] + '0';
    	return ans;
    }
    string chu(string s1,string s2){
    	if(s1 == "0") return "0";
    	memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        memset(c,0,sizeof c);
        if(s2 == "0") return "[ProErorr] at chu";
        long long d = stoi(s2);
        int l = s1.size();
        for(int i = 0;i < l;i++) a[i] = s1[i] - '0';
        long long t = 0;
        for(int i = 0;i < l;i++){
            t = t * 10 + a[i];
            if(t >= d){
                c[i] = t / d;
                t %= d;
            }
        }
        int le = 0;
        while(c[le] == 0 && le <= l) le++;
        string ans = "";
        for(int i = le;i < l;i++) ans += c[i] + '0';
        return ans;
	}
}
signed main(){
	string r,c; cin >> r >> c;
	string ans = BIGINT::cheng(c,BIGINT::jia(c,"1"));
	ans = BIGINT::cheng(ans,BIGINT::jia(c,"2"));
	ans = BIGINT::cheng(ans,BIGINT::jia(BIGINT::jian(BIGINT::cheng(r,"2"),c),"1"));
	cout << BIGINT::chu(ans,"12") << " " << 0;
	return 0;
}
2025/7/21 10:20
加载中...