QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#720839#9574. Stripsucup-team902#WA 0ms12552kbC++172.8kb2024-11-07 14:23:222024-11-07 14:23:23

Judging History

你现在查看的是最新测评结果

  • [2024-11-07 14:23:23]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:12552kb
  • [2024-11-07 14:23:22]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1<<19;
const int mod=998244353;
using arr=int[N+5];
int add(int x,int y){ return (x+=y)>=mod?x-mod:x; }
int sub(int x,int y){ return (x-=y)<0?x+mod:x; }
int red(int &x){ return x+=(x>>31)&mod; }
int ksm(ll x,int tp,int s=1){
    for(;tp;x=x*x%mod,tp>>=1) if(tp&1) s=x*s%mod;
    return s;
}
int fac[N+5],ifac[N+5];
void prep(){
    fac[0]=1;
    for(int i=1;i<=N;i++) fac[i]=1ll*fac[i-1]*i%mod;
    ifac[N]=ksm(fac[N],mod-2);
    for(int i=N;i;i--) ifac[i-1]=1ll*ifac[i]*i%mod;
}
int C(int n,int m){ return n<0||m<0||n<m?0:1ll*fac[n]*ifac[m]%mod*ifac[n-m]%mod; }
namespace poly{
    int L,iv;
    arr w,rev;
    arr pa,pb;
    #define szf sizeof(int)
    void cl(arr a){ memset(a,0,L*szf); }
    void r_prep(){
        int L=N>>1;
        int val=ksm(3,(mod-1)/N);
        w[L]=1;
        for(int i=1;i<L;i++) w[i+L]=1ll*w[i+L-1]*val%mod;
        for(int i=L-1;i;i--) w[i]=w[i<<1];
    }
    void pre_n(int n){
        L=1; while(L<n) L<<=1;
        iv=mod-(mod-1)/L;
        for(int i=1;i<L;i++) rev[i]=(rev[i>>1]>>1)|(i&1?L>>1:0);
    }
    void FFT(arr t,bool ok=1){
        int x,y;
        for(int i=1;i<L;i++)
            if(i<rev[i]) swap(t[i],t[rev[i]]);
        for(int i=1;i<L;i<<=1)
            for(int j=0;j<L;j+=i<<1)
                for(int l=0;l<i;l++){
                    x=t[j+l]; y=1ll*t[i+j+l]*w[i+l]%mod;
                    t[i+j+l]=sub(x,y); t[j+l]=add(x,y);
                }
        if(!ok){
            reverse(t+1,t+L);
            for(int i=0;i<L;i++) t[i]=1ll*t[i]*iv%mod;
        }
    }
    void NTT(arr a){ FFT(a); }
    void INTT(arr a){ FFT(a,0); }
    void NTT(arr a,arr b){ memcpy(b,a,L*szf); FFT(b); }
    void INTT(arr a,arr b){ memcpy(b,a,L*szf); FFT(b,0); }
    void Mult(arr a,arr b,arr c,int n){
        pre_n(n);
        NTT(a,pa); NTT(b,pb);
        for(int i=0;i<L;i++)
            c[i]=1ll*pa[i]*pb[i]%mod;
        INTT(c);
        fill(c+n,c+L,0);
        cl(pa); cl(pb);
    }
};
int n,m;
arr a;
arr f,g;
void solve(){
    scanf("%d %d",&n,&m);
    int s=n*m;
    for(int i=1;i<=s;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+1+s);
    for(int i=0;i<=n;i++){
        for(int j=0;j<=m;j++){
            int c=1ll*C(n,i)*C(m,j)%mod;
            if(i+j&1) c=mod-c;
            f[(n-i)*(m-j)]=add(f[(n-i)*(m-j)],c);
        }
    }
    int ans=0;
    for(int i=0;i<s;i++){
        int v=a[i+1]-a[i];
        // printf("%d\n",v);
        for(int j=0;j<=s;j++){
            int coe=1ll*C(s-j,s-i)*f[j]%mod*fac[s-i]%mod*fac[i]%mod;
            // printf("%d ",coe);
            ans=(ans+1ll*coe*v)%mod;
        }
    }
    printf("%d\n",ans);
}
int main(){
    prep();
    int t; scanf("%d",&t);
    while(t--) solve();
    return 0;
}

詳細信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 12552kb

input:

4
5 2 3 16
7 11 2 9 14
13 5
3 2 4 11
6 10 2
1 11
2 1 2 6
1 5
3
2 1 2 6
1 5
2

output:

345600
20736
256677120
583269120

result:

wrong answer Integer parameter [name=c] equals to 345600, violates the range [-1, 5] (test case 1)