結果
問題 | No.2633 Subsequence Combination Score |
ユーザー |
|
提出日時 | 2024-02-16 22:53:53 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 4,082 bytes |
コンパイル時間 | 1,604 ms |
コンパイル使用メモリ | 176,544 KB |
実行使用メモリ | 32,168 KB |
最終ジャッジ日時 | 2024-09-28 21:30:58 |
合計ジャッジ時間 | 32,393 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 24 WA * 14 |
ソースコード
/*Things to notice:1. do not calculate useless values2. do not use similar namesThings to check:1. submit the correct file2. time (it is log^2 or log)3. memory4. prove your naive thoughts5. long long6. corner case like n=0,1,inf or n=m7. check if there is a mistake in the ds or other tools you use8. fileio in some oi-contest9. module on time10. the number of a same divisor in a math problem11. multi-information and queries for dp and ds problems*/#include<bits/stdc++.h>using namespace std;#define int long long#define fi first#define se second#define pii pair<long long,long long>#define mp make_pair#define pb push_backconst int mod=998244353;const int inf=0x3f3f3f3f;const int INF=1e18;int fpow(int x,int b){if(x==0) return 0;if(b==0) return 1;int res=1;while(b>0){if(b&1) res=1LL*res*x%mod;x=1LL*x*x%mod;b>>=1;}return res;}struct Mypoly{int n,m;int a[2200005],b[2200005],p[2200005],c[2200005];int N=1,lg;// nttvoid ntt(int *A){for(int i=0;i<N;i++) if(i<p[i]) swap(A[i],A[p[i]]);for(int mid=1;mid<N;mid*=2){int v=fpow(3,(mod-1)/(mid*2));for(int j=0;j<N;j+=mid*2){int w=1;for(int k=0;k<mid;k++,w=(w*v)%mod){int t1=A[j+k],t2=(w*A[j+k+mid])%mod;A[j+k]=(t1+t2)%mod,A[j+k+mid]=(t1-t2+mod)%mod;}}}}void intt(int *A){for(int i=0;i<N;i++) if(i<p[i]) swap(A[i],A[p[i]]);for(int mid=1;mid<N;mid*=2){int v=fpow(fpow(3,mod-2),(mod-1)/(mid*2));for(int j=0;j<N;j+=mid*2){int w=1;for(int k=0;k<mid;k++,w=(w*v)%mod){int t1=A[j+k],t2=(w*A[j+k+mid])%mod;A[j+k]=(t1+t2)%mod,A[j+k+mid]=(t1-t2+mod)%mod;}}}int inv=fpow(N,mod-2);for(int i=0;i<=n+m;i++) A[i]=A[i]*inv%mod;}void init_butterfly(int x){N=1,lg=0;while(N<x) N*=2,lg++;for(int i=1;i<N;i++) p[i]=(p[i>>1]>>1)|((i&1)<<(lg-1));}// poly mulvector <int> mul(vector <int> P,vector <int> Q){// memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(p,0,sizeof(p));n=P.size()-1,m=Q.size()-1;for(int i=0;i<=n;i++) a[i]=P[i];for(int i=0;i<=m;i++) b[i]=Q[i];init_butterfly(n+m+1);ntt(a),ntt(b);for(int i=0;i<N;i++) a[i]=(a[i]*b[i])%mod;intt(a);vector <int> res;res.clear();for(int i=0;i<=n+m;i++) res.pb(a[i]);for(int i=0;i<=2*N;i++) a[i]=b[i]=p[i]=0;return res;}// poly invvoid work_getinv(int deg){if(deg==1){b[0]=fpow(a[0],mod-2);return;}work_getinv((deg+1)>>1);init_butterfly(deg<<1);for(int i=0;i<deg;i++) c[i]=a[i];for(int i=deg;i<N;i++) c[i]=0;ntt(c),ntt(b);for(int i=0;i<N;i++) b[i]=1LL*(2-1LL*c[i]*b[i]%mod+mod)%mod*b[i]%mod;intt(b);for(int i=deg;i<N;i++) b[i]=0;}vector <int> getinv(vector <int> P){n=P.size();// memset(a,0,sizeof(a)),memset(b,0,sizeof(b)),memset(p,0,sizeof(p));for(int i=0;i<n;i++) a[i]=P[i];work_getinv(n);vector <int> Q;for(int i=0;i<n;i++) Q.pb(b[i]);for(int i=0;i<=2*N;i++) a[i]=b[i]=p[i]=0;return Q;}}poly;int fac[300005],ifac[300005];int C(int x,int y){if(y>x) return 0;if(x==y||y==0) return 1;return 1LL*fac[x]*ifac[x-y]%mod*ifac[y]%mod;}void init(int x){fac[0]=fac[1]=1;for(int i=2;i<=x;i++) fac[i]=1LL*fac[i-1]*i%mod;ifac[x]=fpow(fac[x],mod-2); // x should be less than mod!!!for(int i=x-1;i>=0;i--) ifac[i]=1LL*ifac[i+1]*(i+1)%mod;}int n;int a[100005],dp[100005];void divide(int l,int r){if(l==r){dp[l]=(dp[l]+ifac[l])%mod;dp[l]=dp[l]*(fpow(2,a[l])-1)%mod;// cout<<l<<": "<<dp[l]<<"\n";return;}int mid=(l+r)>>1;divide(l,mid);vector <int> P,Q;for(int i=0;i<=r-l+1;i++) P.pb(ifac[i]);for(int i=l;i<=mid;i++) Q.pb(dp[i]);P=poly.mul(P,Q);for(int i=mid+1;i<=r;i++) dp[i]=(dp[i]+P[i-l])%mod;divide(mid+1,r);}void solve(){cin>>n;init(300000);while(n--){int x;cin>>x;a[x]++;}int ans=0;divide(0,100000);for(int i=1;i<=100000;i++) ans=(ans+dp[i]*fac[i])%mod;cout<<ans<<"\n";}signed main(){ios::sync_with_stdio(0);cin.tie(0);int _=1;// cin>>_;while(_--) solve();return 0;}