結果
問題 |
No.3117 Reversible Tile
|
ユーザー |
|
提出日時 | 2025-04-24 15:03:23 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 95 ms / 3,000 ms |
コード長 | 1,588 bytes |
コンパイル時間 | 2,321 ms |
コンパイル使用メモリ | 198,952 KB |
実行使用メモリ | 7,844 KB |
最終ジャッジ日時 | 2025-04-24 15:03:27 |
合計ジャッジ時間 | 4,357 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 |
ソースコード
#include <bits/stdc++.h> using namespace std; const long long MOD = 998244353; long long mod_pow(long long a,long long e){ long long r=1; while(e){ if(e&1) r=r*a%MOD; a=a*a%MOD; e>>=1; } return r; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N,M; cin>>N>>M; vector<int> A(N); for(int& x:A) cin>>x; /* 差分と w 計算 */ int n=N+1; vector<int> D(N); D[0]=A[0]; for(int i=1;i<N;i++) D[i]=A[i]^A[i-1]; int wp=accumulate(D.begin(),D.end(),0); int s=wp&1, w=wp+s; // |B| /* 階乗 */ vector<long long> fact(n+1,1),invf(n+1,1); for(int i=1;i<=n;i++) fact[i]=fact[i-1]*i%MOD; invf[n]=mod_pow(fact[n],MOD-2); for(int i=n;i>=1;i--) invf[i-1]=invf[i]*i%MOD; auto C=[&](int a,int b)->long long{ if(b<0||b>a) return 0; return fact[a]*invf[b]%MOD*invf[a-b]%MOD; }; long long choose_n2 = 1LL*n*(n-1)/2 % MOD; vector<long long> gpow(n+1); for(int k=0;k<=n;k++){ long long g = (choose_n2 - 2LL*k%MOD*(n-k))%MOD; if(g<0) g += MOD; gpow[k]=mod_pow(g,M); } long long ans=0; for(int k=0;k<=n;k++){ long long Kw=0; int up=min(k,w); for(int s0=0;s0<=up;s0++){ long long term = C(w,s0)*C(n-w,k-s0)%MOD; if(s0&1) Kw = (Kw - term + MOD)%MOD; else Kw = (Kw + term)%MOD; } ans = (ans + gpow[k]*Kw)%MOD; } long long inv2 = mod_pow(2,MOD-2); ans = ans * mod_pow(inv2,n) % MOD; cout<<ans<<"\n"; return 0; }