我这个int128怎么不对?

P1005 [NOIP2007 提高组] 矩阵取数游戏

@[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


|