QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#722295 | #7754. Rolling For Days | xzzduang | WA | 1ms | 5744kb | C++23 | 2.0kb | 2024-11-07 18:30:28 | 2024-11-07 18:30:29 |
Judging History
answer
#include<iostream>
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#define ll long long
#define ld long double
#define fi first
#define se second
#define int long long
#define pii pair<int,int>
#define lowbit(x) ((x)&-(x))
#define popcount(x) __builtin_popcount(x)
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
#define umap unordered_map
#define all(x) x.begin(),x.end()
#define mk make_pair
#define pb push_back
#define ckmax(x,y) x=max(x,y)
#define ckmin(x,y) x=min(x,y)
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
inline int read(){
int x=0,f=0; char ch=getchar();
while(!isdigit(ch)) f|=(ch==45),ch=getchar();
while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return f?-x:x;
}
#define N 1005
#define M 12
int n,m,a[N],b[N],nn,sa[1<<M],sb[1<<M],g[N][1<<M],f[N][1<<M],inv[N],C[N][N],fac[N];
const int mo=998244353;
inline void red(int &x){x>=mo?x-=mo:0;}
inline int qpow(int x,int b){
int res=1;
for(;b;x=x*x%mo,b>>=1) if(b&1) res=res*x%mo;
return res;
}
signed main(){
n=read(),m=read();
for(int i=0;i<m;++i) a[i]=read(),sa[1<<i]=a[i];
for(int i=0;i<m;++i) b[i]=read(),nn+=b[i],sb[1<<i]=b[i];
for(int s=0;s<(1<<m);++s){
sa[s]=sa[lowbit(s)]+sa[s^lowbit(s)];
sb[s]=sb[lowbit(s)]+sb[s^lowbit(s)];
}
fac[0]=C[0][0]=1;
for(int i=1;i<=n;++i) inv[i]=qpow(i,mo-2),fac[i]=fac[i-1]*i%mo;
for(int i=1;i<=n;++i){
C[i][0]=1;
for(int j=1;j<=i;++j) red(C[i][j]=C[i-1][j]+C[i-1][j-1]);
}
f[0][0]=1;
for(int i=0;i<nn;++i){
for(int s=0;s<(1<<m);++s){
int t=n-i-(sa[s]-sb[s]);
red(f[i+1][s]+=f[i][s]*inv[t]%mo);
red(g[i+1][s]+=g[i][s]*inv[t]%mo);
red(g[i+1][s]+=(n-i)*inv[t]%mo*inv[t]%mo*f[i][s]%mo);
for(int j=0;j<m;++j){
if((1<<j)&s) continue;
int tmp=inv[t]*C[i-sb[s]][b[j]-1]%mo*C[a[j]][b[j]]%mo*fac[b[j]]%mo;
red(f[i+1][s|(1<<j)]+=f[i][s]*tmp%mo);
red(g[i+1][s|(1<<j)]+=g[i][s]*tmp%mo);
red(g[i+1][s|(1<<j)]+=(n-i)*inv[t]%mo*tmp%mo*f[i][s]%mo);
}
}
}
cout<<g[nn][(1<<m)-1];
return 0;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 5724kb
input:
2 2 1 1 1 1
output:
2
result:
ok answer is '2'
Test #2:
score: 0
Accepted
time: 0ms
memory: 5744kb
input:
4 2 2 2 2 1
output:
582309210
result:
ok answer is '582309210'
Test #3:
score: -100
Wrong Answer
time: 0ms
memory: 5720kb
input:
5 5 1 1 1 1 1 0 0 0 0 1
output:
0
result:
wrong answer expected '5', found '0'