RT,没有压位导致TLE我能理解,但是为什么第二个点WA了啊
#include<bits/stdc++.h>
using namespace std;
int k,Len,R;
char s[10005];
struct node{
int len,x[100005];
}l,r,lazy,mid,n,ans;
node Add(node u,node v){
node res=lazy;
for(int i=1;i<=max(u.len,v.len);i++){
res.x[i]+=u.x[i]+v.x[i];
res.x[i+1]=res.x[i]/10;
res.x[i]%=10;
}
res.len=max(u.len,v.len);
if(res.x[res.len+1])res.len++;
return res;
}
node Mul(node a,node b) {
node res=lazy;
res.len=a.len+b.len-1;
for(int i=1; i<=a.len; i++)
for(int j=1; j<=b.len; j++)
res.x[i+j-1]+=a.x[i]*b.x[j];
for(int i=1; i<=a.len+b.len-1; i++) {
res.x[i+1]+=res.x[i]/10;
res.x[i]%=10;
}
if(res.x[a.len+b.len])res.len++;
return res;
}
node Max(node a,node b) {
if(a.len>b.len)return a;
else if(b.len>a.len)return b;
else {
for(int i=a.len; i>=1; i--){
if(a.x[i]>b.x[i])return a;
if(b.x[i]>a.x[i])return b;
}
return a;
}
}
node update(node u){
for(int i=u.len;i>=1;i--){
if(u.x[i]%2)u.x[i-1]+=10;
u.x[i]/=2;
}
if(u.x[u.len]==0)u.len--;
return u;
}
void print(node a) {
for(int i=a.len; i>=1; i--)printf("%d",a.x[i]);
putchar('\n');
}
node low(node u){
int now=1;
while(u.x[now]==0){
u.x[now]=9;
now++;
}
u.x[now]--;
if(!u.x[u.len])u.len--;
return u;
}
node up(node u){
int now=1;
while(u.x[now]==9){
u.x[now]=0;
now++;
}
u.x[now]++;
u.len=max(u.len,now);
return u;
}
node pow(node u,int y){
node res;
res.len=res.x[1]=1;
while(y){
if(y&1)res=Mul(res,u);
u=Mul(u,u);
y>>=1;
}
return res;
}
bool check(node a,node b){
if(a.len!=b.len)return 0;
for(int i=1;i<=a.len;i++)if(a.x[i]!=b.x[i])return 0;
return 1;
}
int main(){
cin>>k>>(s+1);
if(k==1){
cout<<(s+1)<<endl;
return 0;
}
Len=strlen(s+1);
n.len=Len;
for(int i=1;i<=Len;i++)
n.x[Len-i+1]=s[i]-'0';
if(Len==1&&s[1]==0){
cout<<0<<endl;
return 0;
}
R=Len/k+5;
r.len=R;
for(int i=1;i<=r.len;i++)r.x[i]=9;
l.len=1,l.x[1]=1;
while(check(Max(l,r),r)){
mid=Add(l,r);
mid=update(mid);
node MUL=pow(mid,k);
if(check(MUL,n)){
print(mid);
return 0;
}
else if(check(Max(MUL,n),MUL))r=low(mid);
else ans=mid,l=up(mid);
}
print(ans);
}