手写高精度无输出求调!(悬3关)
查看原帖
手写高精度无输出求调!(悬3关)
1023793
yaodiguoan楼主2024/7/19 11:54
#include <bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
//#pragma GCC optimize(3, "Ofast", "inline")
#define hh putchar('\n')
#define kg putchar(' ')
#define debug puts("debug")
//#define int long long
//#define int __int128
namespace quickread{
	template<typename T> void read(T &x){
		x=0;char c=getchar();T neg=0;
		while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
		while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
		if(neg) x=(~x)+1;
	}
	template<typename T> void write(T x){
		if(x<0) putchar('-'),x=~x+1;
		if(x>9) write(x/10);
		putchar(x%10^48);
	}
	inline string readstr(){
    	char ch=getchar();string str="";
		while(!isalnum(ch)) ch=getchar();
		while(isalnum(ch)){str+=ch;ch=getchar();}
		return str;
	}
	inline char readchar(){
		char ch=getchar();
		while(!isalnum(ch)) ch=getchar();
		return ch;
	}
}
using namespace quickread;
const int N=1e3+10,M=10,inf=2147483647;
int leng(int x){int len;while(x) ++len,x/=10;return len;}
struct int256{
	int a[N],len;
 	int256() {memset(a,0,sizeof(a)),len=0;}
	void print(){for(int i=len;i>=1;i--) write(a[i]);}
	void operator = (int x){len=0;while(x) a[++len]=x%10,x/=10;}
	void operator = (int256 x){len=x.len;for(int i=1;i<=len;i++) a[i]=x.a[i];}
};
int256 operator * (int256 A,int256 B){
	int256 ans;
	ans.len=A.len+B.len;
	for(int i=1;i<=A.len;i++)
		for(int j=1;j<=B.len;j++)
			ans.a[i+j-1]+=A.a[i]*B.a[j];
	for(int i=1;i<=ans.len;i++) ans.a[i+1]+=ans.a[i]/10,ans.a[i]%=10;
	while(!ans.a[ans.len]) --ans.len;
	return ans;
}
int256 operator * (int256 A,int x){
	int256 ans;
	ans.len=A.len+leng(x);
	for(int i=1;i<=ans.len;i++) ans.a[i]=A.a[i]*x;
	for(int i=1;i<=ans.len;i++) ans.a[i+1]+=ans.a[i]/10,ans.a[i]%=10;
	while(!ans.a[ans.len]) --ans.len;
	return ans;
}
bool operator < (int256 A,int256 B){
	if(A.len!=B.len) return A.len<B.len;
	for(int i=A.len;i>=1;i--) if(A.a[i]!=B.a[i]) return A.a[i]<B.a[i];
	return 1;
}
int256 dp[N][M],ans;
int n,m,a[N];
int256 num(int l,int r){int256 mul;mul=1;for(int i=l;i<=r;i++) mul=mul*a[i];return mul;}
signed main(){
//	ios::sync_with_stdio(0);
//	cin.tie(0);cout.tie(0);
	read(n),read(m);++m;
	for(int i=1;i<=n;++i) a[i]=readchar()-'0';
	dp[1][1]=num(1,1);
	for(int i=2;i<=n;i++)
		for(int k=1;k<=min(k,i);k++)
			for(int j=k-1;j<i;j++)
				dp[i][k]=dp[j][k-1]*num(j+1,i);
	for(int i=1;i<=m;i++) ans=(ans<dp[n][i]?dp[n][i]:ans);
	ans.print();
	return 0;
}


2024/7/19 11:54
加载中...