結果
問題 | No.2514 Twelvefold Way Returns |
ユーザー |
|
提出日時 | 2023-10-20 23:12:27 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 101 ms / 3,000 ms |
コード長 | 1,709 bytes |
コンパイル時間 | 844 ms |
コンパイル使用メモリ | 75,480 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-20 22:30:25 |
合計ジャッジ時間 | 3,923 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 38 |
ソースコード
#include<iostream>#include<cassert>#include<atcoder/modint>using namespace std;#include<vector>template<typename T>struct combination{vector<T>fac,ifac;combination(size_t N=0):fac(1,1),ifac(1,1){make_table(N);}void make_table(size_t N){if(fac.size()>N)return;size_t now=fac.size();N=max(N,now*2);fac.resize(N+1);ifac.resize(N+1);for(size_t i=now;i<=N;i++)fac[i]=fac[i-1]*i;ifac[N]=1/fac[N];for(size_t i=N;i-->now;)ifac[i]=ifac[i+1]*(i+1);}T factorial(size_t n){make_table(n);return fac[n];}T invfac(size_t n){make_table(n);return ifac[n];}T P(size_t n,size_t k){if(n<k)return 0;make_table(n);return fac[n]*ifac[n-k];}T C(size_t n,size_t k){if(n<k)return 0;make_table(n);return fac[n]*ifac[n-k]*ifac[k];}T H(size_t n,size_t k){if(n==0)return k==0?1:0;return C(n-1+k,k);}};using mint=atcoder::modint998244353;combination<mint>C;struct W{mint w[3];};W mul(W a,W b){W ret;for(int i=0;i<3;i++)ret.w[i]=mint::raw(0);for(int i=0;i<3;i++)for(int j=0;j<3;j++)ret.w[(i+j)%3]+=a.w[i]*b.w[j];return ret;}W pw(W x,int N){W e;e.w[0]=1;e.w[1]=e.w[2]=0;while(N){if(N%2)e=mul(e,x);N>>=1;x=mul(x,x);}return e;}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int N,M;cin>>N>>M;mint ans=0;for(int a=0;a<=M;a++)for(int b=0;a+b<=M;b++){int c=M-a-b;//(a+bw+cw^2)^N*w^(2b+c)W x;x.w[0]=a,x.w[1]=b,x.w[2]=c;W ret=pw(x,N);int t=(2*b+c)%3;W y;y.w[0]=y.w[1]=y.w[2]=0;y.w[t]=1;ret=mul(ret,y);mint now=0;now+=ret.w[0];now-=(ret.w[1]+ret.w[2])/2;ans+=now*C.C(M,a)*C.C(M-a,b);}ans/=mint(3).pow(M);cout<<ans.val()<<endl;}