WA on 2求助
查看原帖
WA on 2求助
200044
JS_TZ_ZHR楼主2021/4/3 10:04

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);
}
2021/4/3 10:04
加载中...