问
  • 板块灌水区
  • 楼主technology_s
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/4/19 16:50
  • 上次更新2024/4/19 19:53:31
查看原帖
问
1061770
technology_s楼主2024/4/19 16:50

这份代码在lg为啥会CE(应该是高精的问题)

#include<bits/stdc++.h>
using namespace std;
string s;
int n,r;
const int maxlen=1e5;
const int wei=9;
const long long mod=1e9;
struct Node{
	int cnt;
	long long a[maxlen];
	Node(){memset(a,0,sizeof(a)),cnt=0;}
	inline void write(){
		printf("%lld",a[cnt]);
		for(int i=cnt-1;i>=0;i--) printf("%0*lld",wei,a[i]);
	}inline friend Node operator + (const Node &x,const Node &y){
		Node z;z.cnt=max(x.cnt,y.cnt);
		for(int i=0;i<=z.cnt;i++){
			z.a[i]+=x.a[i]+y.a[i];
			if(z.a[i]>=mod) z.a[i+1]=1,z.a[i]-=mod;
		}if(z.a[z.cnt+1]>0) ++z.cnt;
		return z;
	}inline friend Node operator - (const Node &x,const Node &y){
		Node z;z.cnt=x.cnt;
		for(int i=0;i<=z.cnt;i++){
			z.a[i]+=x.a[i]-y.a[i];
			if(z.a[i]<0) z.a[i+1]=-1,z.a[i]+=mod;
		}while(z.cnt&&!z.a[z.cnt]) z.cnt--;
		return z;
	}inline friend Node operator * (const Node &x,const Node &y){
		Node z;z.cnt=x.cnt+y.cnt;
		for(int i=0;i<=z.cnt;i++)
			for(int j=min(i,x.cnt),end=max(i-y.cnt,0);j>=end;j--)
				z.a[i]+=x.a[j]*y.a[i-j],z.a[i+1]+=z.a[i]/mod,z.a[i]%=mod;
		if(z.a[z.cnt+1]) z.cnt++;
		while(z.cnt&&!z.a[z.cnt]) z.cnt--;
		return z;
	}inline friend Node operator + (const Node &x,const int &s){
		Node y;y.a[0]=s;y.cnt=0;
		return x+y;
	}
	inline friend Node operator * (const Node &x,const int &s){
		Node y;y.a[0]=s;y.cnt=0;
		return x*y;
	}inline friend bool operator < (const Node &x,const Node &y){
		if(x.cnt!=y.cnt){
			return x.cnt<y.cnt;
		}for(int i=0;i<=x.cnt;i++){
			if(x.a[i]!=y.a[i]){
				return x.a[i]<y.a[i];
			}
		}
	}
}a[110][110],dp[110][110];
int main(){
    scanf("%d%d",&n,&r);
    cin>>s;
    for(int i=0;i<n;i++){
        for(int j=i;j<n;j++){
            for(int k=i;k<=j;k++){
                a[i+1][j+1]=a[i+1][j+1]*10;
                a[i+1][j+1]=a[i+1][j+1]+(s[k]-'0');
            }
        }
    }for(int i=1;i<=n;i++){
        dp[i][0]=a[1][i];
    }for(int k=1;k<=r;k++){
        for(int i=k+1;i<=n;i++){
            for(int j=k;j<i;j++){
                dp[i][k]=max(dp[i][k],dp[j][k-1]*a[j+1][i]);
            }
        }
    }dp[n][r].write();
    return 0;
}
2024/4/19 16:50
加载中...