@[ShaunJulian](/user/998474) 天才,pow128写不了,要用手写
```cpp
#include<bits/stdc++.h>
using namespace std;
typedef __int128_t int128;
int N,M;
int128 ans;
int128 b[9999999];
int128 dp[1001][1001];
int128 read()
{
int128 x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return f?-x:x;
}
inline void write(int128 x)
{
if(x<0)
putchar('-');
if(x>9)
write(x/10);
putchar(x%10+'0');
}
int128 qpow(int128 x,int128 y){
if(y==1) return x;
if(y==0) return 1;
int128 c=qpow(x,y/2);
if(y%2==1){
return c*c*x;
}
return c*c;
}
int main()
{
cin>>N>>M;
while(N--)
{
for(int i=1;i<=M;i++)
b[i]=read();
int128 pre=0;
for(int i=1;i<=M;i++)
for(int j=M;j>=i;j--)
{
dp[i][j]=max(dp[i-1][j]+b[i-1]*qpow(2,M-j+i-1),dp[i][j+1]+b[j+1]*qpow(2,M-j+i-1));
if(i==j)
{
dp[i][j]+=b[i]*pow(2,M);
pre=max(pre,dp[i][j]);
}
}
ans+=pre;
memset(dp,0,sizeof(dp));
}
write(ans);
return 0;
}
```
这个有60,剩下的应该是炸了
by songzhihan2010 @ 2023-12-17 09:50:55
@[songzhihan2010](/user/910357) 我自己的和你写的都测了一下,都是60。
但是那句pow(2,M)改成(1<<M)的话行不行?我怎样告诉计算机那个1是int128型的?(当然这么改也没用,毕竟int128范围不够)
最好么当然是写一个大整数类什么的。
反正高精度基本不会再考。
by ShaunJulian @ 2023-12-18 14:22:56
@[songzhihan2010](/user/910357) 我题解里好像看到有别人用的是另外的递推公式,int128能过
by ShaunJulian @ 2023-12-18 14:24:20
@[ShaunJulian](/user/998474) 看了你的代码,你好像就是用__int128过的,应该是一些细节,话说int128支持位移吗?我没试过啊啊啊
by songzhihan2010 @ 2023-12-18 21:52:22