P2293
麻烦dalao改下代码,没有输出,代码里有注释
裸的高精都卡了,太蒻了
#include<bits/stdc++.h>
using namespace std;
struct js {
int len;
int nums[10010];
};
int sum;
string s;
js t;
js L, R, mid;
js cheng(js a, js b) {
js c;
for (int i = 1; i <= a.len; i++) {
int x = 0; //用于存放进位
for (int j = 1; j <= b.len; j++) { //对乘数的每一位进行处理
c.nums[i + j - 1] = a.nums[i] * b.nums[j] + x + c.nums[i + j - 1]; //当前乘积 +上次乘积进位 +原数
x = c.nums[i + j - 1] / 10;
c.nums[i + j - 1] %= 10;
}
c.nums[i + b.len] = x; //进位
}
c.len = a.len + b.len;
while (c.nums[c.len] == 0 && c.len > 1) //删除前导0
c.len--;
return c;
}
js pown(js a) {
js ans;
ans.len = 1, ans.nums[1] = 1;
for (int i = 0; i < sum; i++)
ans = cheng(ans, a);
return ans;
}
js jia(js a, js b) {
js c;
for (int i = 1; i <= c.len; i++) {
c.nums[i] += a.nums[i] + b.nums[i];
c.nums[i + 1] = c.nums[i] / 10;
c.nums[i] %= 10;
}
return c;
}
js pj(js a, js b) {
js ans;
ans = jia(a, b);
for (int i = ans.len; i >= 2; i++) {
ans.nums[i - 1] += (ans.nums[i] % 2) * 10; //CSP代码
ans.nums[i] /= 2;
}
ans.nums[1] /= 2;
while (ans.nums[ans.len] == 0)
ans.len--;
return ans;
}
js jiaer(js a) {
js ans;
ans = a;
ans.nums[1] += 2;
int i = 1;
while ((i <= ans.len) && (ans.nums[i] >= 10)) {
ans.nums[i + 1] += ans.nums[i] / 10;
ans.nums[i] %= 10;
i++;
}
if (ans.nums[ans.len + 1] > 0)
ans.len++;
return ans;
}
bool maxmin(js a, js b) {
// 若大整数 a>b 则返回 true,否则返回 false
if (a.len < b.len) return false;
if (a.len > b.len) return true;
for (int i = a.len; i >= 1; i--) {
if (a.nums[i] < b.nums[i])return false;
if (a.nums[i] > b.nums[i]) return true;
}
return false;
}
int main() {
// freopen("英文小写文件名.in","r",stdin);
// freopen("英文小写文件名.out","w",stdout);
cin >> sum >> s;
if (s == "0") {
cout << 0;
return 0;
}
t.len = s.length();
for (int i = 1; i <= t.len; i++)
t.nums[i] = s[t.len - i] - '0';
L.len = 1, L.nums[1] = 1, R = t;
while (!maxmin(jiaer(L), R)){
mid = pj(L, R);
if (maxmin(pown(mid), t)) R = mid;
else L = mid;
}
for (int i = L.len; i >= 1; i--)
cout << L.nums[i];
cout << endl;
return 0;
}