从昨天调到今天,昨天是高精比较出了问题,今天不知道是什么高精结构体有点过度压行
#include <bits/stdc++.h>
using namespace std;
struct bigint{int len=1;int num[100]={0};bigint&operator=(long long t){int i=0;while(t){num[i++]=t%10;t/=10;}len=i;return*this;}int operator[](int i)const{return num[i];}bigint&operator=(string t){len=t.length();for(int i=0;i<(int)t.length();i++){num[i]=t[len-i-1]-'0';}return*this;}void print(ostream&co=cout)const{for(int i=len-1;i>=0;i--)co<<num[i];}bool operator==(const bigint t)const{if(len!=t.len)return 0;for(int i=0;i<len;i++){if(num[i]!=t[i]){return 0;}}return 1;}bool operator<(const bigint t)const{if(len!=t.len)return len<t.len;for(int i=len-1;i>=0;i--){return num[i]<t[i];}}bool operator>(const bigint t)const{if(len!=t.len)return len>t.len;for(int i=len-1;i>=0;i--){return num[i]>t[i];}}bigint operator*(const bigint&b){int len3=len+b.len;bigint c;c.len=len3;for(int i=0;i<len;i++){for(int j=0;j<b.len;j++){c.num[i+j]+=num[i]*b[j];}}for(int i=0;i<len3;i++){c.num[i+1]+=c.num[i]/10;c.num[i]=c.num[i]%10;}while(1){if(c[len3-1]||len3==1)break;len3--;}c.len=len3;return c;}bigint operator+(const bigint&b){bigint c;int len3=max(len,b.len);int jin=0;for(int i=0;i<=len3-1;i++){c.num[i]=num[i]+b[i]+jin;if(c[i]>9){c.num[i+1]+=c.num[i]-9;c.num[i]-=10;jin=1;}else{jin=0;}}c.len=len3;return c;}bigint operator-(const bigint&b){bigint c;int len3=max(len,b.len);int jie=0;for(int i=0;i<len3;i++){c.num[i]=num[i]-b[i]-jie;if(c.num[i]<0){jie=1;c.num[i]+=10;}else{jie=0;}}while(1){if(c.num[len3-1]!=0||len3==1){break;}len3--;}c.len=len3;return c;}bigint operator+(const int&b){bigint x;x=b;return*this+x;}bigint operator-(const int&b){bigint x;x=b;return*this-x;}bigint operator*(const int&b){bigint x;x=b;return*this*x;}};ostream&operator<<(ostream&co,const bigint&t){t.print(co);return co;}
bigint f[45][45];
int s[45];
int n,k;
string s1;
bigint js(int x,int y){
bigint sum;int t=1;
sum=0;
for(int i=y;i>=x;i--){
sum=sum+s[i]*t;
t*=10;
}
return sum;
}
int main(){
cin>>n>>k>>s1;
for(int i=0;i<s1.length();i++){
s[i+1]=s1[i]-'0';
}
//cout<<s[4]<<endl;
for(int i=1;i<=n;i++){
f[0][i]=js(1,i);
//cout<<endl;
}
for(int i=1;i<=k;i++){
for(int j=1;j<=n;j++){
for(int m=j;m>=i;m--){
//(f[i-1][l-1]*js(l,j)).print();
//cout<<js(l,j).len<<" ";
//cout<<l<<" "<<j<<endl;
//cout<<" ";
//cout<<i<<" "<<j<<endl;
f[i][j]=max(f[i][j],f[i-1][m-1]*js(m,j));
//cout<<i<<" "<<j<<"\n";
//cout<<f[i][j]<<" "<<f[i-1][m-1]*js(m,j);
//cout<<"\n\n";
}
}
}
cout<<f[k][n];
return 0;
}
实测去掉高精能得60分,没压行的在这(只有结构体)
struct bigint {
int len = 1;
int num[100] = {0};
bigint &operator=(long long t) {
int i=0;
while(t) {
num[i++]=t%10;
t/=10;
}
len=i;
return *this;
}
int operator[](int i) const {
return num[i];
}
bigint &operator=(string t) {
len = t.length();
for (int i = 0; i < (int)t.length(); i++) {
num[i] = t[len - i - 1] - '0';
// cout<<1;
}
return *this;
}
void print(ostream &co=cout) const{
for (int i = len - 1; i >= 0; i--) co << num[i];
}
bool operator==(const bigint t) const {
if (len != t.len) return 0;
for (int i = 0; i < len; i++) {
if (num[i] != t[i]) {
return 0;
}
}
return 1;
}
bool operator<(const bigint t) const{
if (len != t.len) return len < t.len;
for (int i = len-1; i >=0; i--) {
//cout<<num[0]<<" "<<t[0]<<"\n";
return num[i] < t[i];
}
}
bool operator>(const bigint t) const{
if (len != t.len) return len > t.len;
for (int i = len-1; i >=0; i--) {
return num[i] > t[i];
}
}
bigint operator*(const bigint &b) {
int len3 = len + b.len;
bigint c;
c.len = len3;
for (int i = 0; i < len; i++) {
for (int j = 0; j < b.len; j++) {
c.num[i + j] += num[i] * b[j];
}
}
// c.print();
for (int i = 0; i < len3; i++) {
c.num[i + 1] += c.num[i] / 10;
c.num[i] = c.num[i] % 10;
}
while (1) {
if (c[len3 - 1] || len3 == 1) break;
len3--;
}
c.len = len3;
return c;
}
bigint operator+(const bigint &b) {
bigint c;
int len3=max(len,b.len);
int jin = 0;
for (int i = 0; i <= len3 - 1; i++) {
c.num[i] = num[i] + b[i] + jin;
if (c[i] > 9) {
c.num[i + 1] += c.num[i] - 9;
c.num[i] -= 10;
jin = 1;
} else {
jin = 0;
}
}
c.len=len3;
return c;
}
bigint operator-(const bigint &b) {
bigint c;
int len3 = max(len,b.len);
int jie = 0;
for (int i = 0; i < len3; i++) {
c.num[i] = num[i]-b[i]-jie;
if(c.num[i] < 0) {
jie =1;
c.num[i] += 10;
} else {
jie = 0 ;
}
}
while(1) {
if(c.num[len3-1]!=0||len3==1) {
break;
}
len3--;
}
c.len=len3;
return c;
}
bigint operator+(const int &b) {
bigint x;
x=b;
return *this+x;
}
bigint operator-(const int &b) {
bigint x;
x=b;
return *this-x;
}
bigint operator*(const int &b) {
bigint x;
x=b;
return *this*x;
}
};
ostream & operator <<(ostream &co,const bigint &t){
t.print(co);
return co;
}