同一份代码有时AC有时CE,求助
  • 板块P8367 [LNOI2022] 盒
  • 楼主ZR_BL
  • 当前回复13
  • 已保存回复14
  • 发布时间2024/12/24 14:14
  • 上次更新2024/12/24 19:40:25
查看原帖
同一份代码有时AC有时CE,求助
793095
ZR_BL楼主2024/12/24 14:14

蒟蒻代码多次CE但找不到原因,在抱着再试一次的心态下又交了一发,突然AC了,将AC代码又交了若干发,有时AC有时CE。哪位大佬愿意指点一下原因,感激不尽。

AC记录 & CE记录

代码是参照第三篇题解题解写的。

code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=3e6+5,mod=998244353;
int n,m,t,ans;
int pre[M+5]={1},rep[M+5],sum[M],w[M];
inline int read(){
    int ans=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch<='9'&&ch>='0'){ans=(ans<<3)+(ans<<1)+(ch^48);ch=getchar();}
    return ans*w;
}
inline int pw(int x,int y){
    int ans=1;
    while(y){
        if(y&1)ans=ans*x%mod;
        x=x*x%mod,y>>=1;
    }
    return ans;
}
inline int C(int x,int y){if(x<y||x<0||y<0)return 0;return pre[x]*rep[y]%mod*rep[x-y]%mod;}//***
struct node{
    int sum,i,s,X,Y;
    inline void init(int x,int y,int ii,int ss){
        sum=0;i=ii,s=ss;X=x,Y=y;
        for(int j=0;j<=ss;j++){
            sum=(sum+C(i+j-1,i-1)*C(x-i+y-j-1,x-i-1)%mod)%mod;
        }
    }
    inline void move_i(int ii){
        if(i>=ii)return;
        for(int j=i+1;j<=ii;j++){
            sum=(sum-C(j+s-1,j-1)*C(X-j+Y-s-1,X-j)%mod)%mod;
        }
        i=ii;
    }
    inline void move_s(int ss){
        if(s>=ss)return;
        for(int j=s+1;j<=ss;j++){
            sum=(sum+C(i+j-1,i-1)*C(X-i+Y-j-1,X-i-1)%mod)%mod;
        }
        s=ss;
    }
}tl[4];
void sol(){
    n=read();ans=0;
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+read();
    for(int i=1;i<n;i++)w[i]=read();
    tl[0].init(n,sum[n],1,sum[n]);//
    tl[1].init(n+1,sum[n]-1,1,sum[n]-1);
    tl[2].init(n,sum[n],1,0);//
    tl[3].init(n+1,sum[n]-1,1,-1);
    for(int i=1;i<n;i++){
        tl[0].move_i(i);
        tl[1].move_i(i+1);
        tl[2].move_s(sum[i]),tl[2].move_i(i);
        tl[3].move_s(sum[i]-1),tl[3].move_i(i+1);
        int res=0;
        res=(-sum[i]*tl[0].sum%mod+i*tl[1].sum%mod+2*sum[i]*tl[2].sum%mod-2*i*tl[3].sum%mod)%mod;
        ans=(ans+res*w[i]%mod)%mod;
    }
    printf("%lld\n",(ans+mod)%mod);
}
signed main(){
    t=read();
    for(int i=1;i<M;i++)pre[i]=pre[i-1]*i%mod;
    rep[M-1]=pw(pre[M-1],mod-2);
    for(int i=M-2;~i;i--)rep[i]=rep[i+1]*(i+1)%mod;
    while(t--)sol();
    return 0;
}
2024/12/24 14:14
加载中...