90pts求调
查看原帖
90pts求调
802557
pyiming楼主2024/5/21 21:47

WA on #1

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5;
const ll mod=20'130'427;
struct input{
    int B;
    int n,m;
    int l[N+2],r[N+2];
    input(){
        cin.tie(0)->sync_with_stdio(0);
        cin>>B;
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>l[i];
        }
        cin>>m;
        for(int i=1;i<=m;i++){
            cin>>r[i];
        }
    }
};
struct Mod{
    ll m,p;
    Mod(ll p):p(p){
        m=((__int128)1<<64)/p;
    }
    ll mod(ll x){
        x=x-((__int128(x)*m)>>64)*p;
        if(x>=p){
            x-=p;
        }
        return x;
    }
}z(mod);
struct dp{
    // int n;
    // int *a;
    int B;
    ll f[N+2][2],g[N+2][2];
    ll v[N+2];
    dp(int B):B(B){
        v[0]=v[1]=0;
        for(int i=2;i<=B;i++){
            v[i]=z.mod(v[i-1]+i-1);
        }
    }
    void clear(int n){
        for(int i=1;i<=n;i++){
            f[i][1]=f[i][0]=g[i][1]=g[i][0]=0;
        }
    }
    ll solve(int n,int a[]){
        clear(n);
        bool flag=1;
        ll s=0,t=0;
        int cnt=0;
        for(ll i=1;i<=n;i++){
            if(flag){
                if(a[i]){
                    flag=0;
                }
                else{
                    cnt++;
                }
            }
            int c=(i==1?0:B);
            g[i][1]=z.mod(z.mod(g[i-1][1]*B)+z.mod((i-cnt)*a[i]));
            f[i][1]=z.mod(f[i-1][1]+g[i][1]);
            g[i][0]=z.mod(z.mod(v[c]+z.mod(z.mod(z.mod(g[i-1][1]*B)*a[i])+z.mod(z.mod(i-cnt)*v[a[i]])))+z.mod(z.mod(z.mod(g[i-1][0]*B)*B)+z.mod(z.mod(s+t)*v[B])));
            f[i][0]=z.mod(z.mod(z.mod(a[i]*f[i-1][1])+z.mod(B*f[i-1][0]))+g[i][0]);
            t=z.mod(c-1+z.mod(z.mod(i-cnt)*a[i])+z.mod(z.mod(t+s)*B));
            s=z.mod(c-1+z.mod(s*(B))+a[i]);
            // cout<<g[i][0]<<" "<<g[i][1]<<"\n";
        }
        return z.mod(f[n][0]+f[n][1]);
    }
};
struct number{
    int n;
    int *a;
    number(int n,int a[]):n(n),a(a){}
    bool operator<(const number b){
        if(n!=b.n){
            return n<b.n;
        }
        for(int i=1;i<=n;i++){
            if(a[i]!=b.a[i]){
                return a[i]<b.a[i];
            }
        }
        return false;
    }
    void prework(int B,int op){
        a[n]+=op;
        for(int i=n;i>=1;i--){
            if(a[i]<0){
                a[i]+=B;
                a[i-1]--;
            }
            else if(a[i]>=B){
                a[i]-=B;
                a[i-1]++;
            }
            else{
                break;
            }
        }
    }
};
int main(){
    // freopen("data.in","r",stdin);
    // freopen("data.out","w",stdout);
    input in;
    number l(in.n,in.l),r(in.m,in.r);
    dp d(in.B);
    if(l.n==1&&l.a[1]==0){
        cout<<d.solve(r.n,r.a)<<"\n";
        return 0;
    }
    // "10418004"
    l.prework(in.B,-1);
    cout<<z.mod(d.solve(r.n,r.a)-d.solve(l.n,l.a)+mod)<<"\n";
    return 0;
}
2024/5/21 21:47
加载中...