結果
| 問題 |
No.1193 Penguin Sequence
|
| コンテスト | |
| ユーザー |
penguinman
|
| 提出日時 | 2020-07-29 18:41:47 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 483 ms / 2,000 ms |
| コード長 | 2,608 bytes |
| コンパイル時間 | 2,486 ms |
| コンパイル使用メモリ | 186,108 KB |
| 実行使用メモリ | 43,028 KB |
| 最終ジャッジ日時 | 2024-10-01 21:19:53 |
| 合計ジャッジ時間 | 15,872 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
#include<bits/stdc++.h>
//ライブラリなどなど
using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::pair;
using ll=long long;
const int MOD=998244353;
const int MAX=1e6;
struct Binary_indexed_tree{
int N;
vector<ll> bit;
Binary_indexed_tree(int n):N(n){
bit.resize(N+1);
}
void add(int x,ll a){
for(x;x<=N;x+=(x&-x)) bit[x]+=a;
}
ll sum(int x){
ll ret=0;
for(x;x>0;x-=(x&-x)) ret+=bit[x];
return ret;
}
};
vector<ll> inv,finv,fac;
void COMinit(){
inv.resize(MAX),finv.resize(MAX),fac.resize(MAX);
fac[0]=fac[1]=1;
finv[0]=finv[1]=1;
inv[1]=1;
for(int i=2;i<MAX;i++){
fac[i]=fac[i-1]*i%MOD;
inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;
finv[i]=finv[i-1]*inv[i]%MOD;
}
}
ll COM(int n,int r){
if(n<r||r<0||n<0) return 0;
return fac[n]*finv[r]%MOD*finv[n-r]%MOD;
}
ll modpow(ll X,ll Y){
ll ret=1;
while(Y){
if(Y%2) ret=ret*X%MOD;
Y/=2;
X=X*X%MOD;
}
return ret;
}
void comp(vector<int> &A){
std::map<int,int> memo;
for(int i=0;i<A.size();i++) memo[A[i]]=0;
int cnt=0;
for(auto &p:memo) p.second=++cnt;
for(int i=0;i<A.size();i++) A[i]=memo[A[i]];
}
ll same(int N,vector<int> A){
ll ret=0;
ll sum=1;
for(int i=1;i<=N;i++) sum=sum*COM(N,i)%MOD;
for(int i=1;i<=N;i++){
ret+=sum*modpow(COM(N,i),MOD-2)%MOD*COM(N-2,i-2)%MOD;
ret%=MOD;
}
ll cnt=0;
Binary_indexed_tree BIT(N);
comp(A);
for(int i=0;i<N;i++){
cnt+=i-BIT.sum(A[i]);
cnt%=MOD;
BIT.add(A[i],1);
}
ret=ret*cnt%MOD;
return ret;
}
ll differ(int N,vector<int> A){
vector<vector<ll>> dp(N+1,vector<ll>(2));
dp[0][0]=1;
for(int i=1;i<=N;i++){
dp[i][1]=(dp[i-1][0]*COM(N-1,i-1)%MOD+dp[i-1][1]*COM(N,i)%MOD)%MOD;
dp[i][0]=dp[i-1][0]*COM(N,i)%MOD;
}
vector<ll> multi(N+2);
multi[N+1]=1;
ll sum=0;
for(int i=N;i>=1;i--){
multi[i]=multi[i+1]*COM(N,i)%MOD;
sum+=multi[i+1]*COM(N-1,i-1)%MOD*dp[i-1][1]%MOD;
sum%=MOD;
}
vector<int> B=A;
sort(B.begin(),B.end());
ll cnt=0;
for(int i=0;i<N;i++){
cnt+=N-distance(B.begin(),std::upper_bound(B.begin(),B.end(),A[i]));
cnt%=MOD;
}
return sum*cnt%MOD;
}
int main(){
ll max=2e5;
ll inf=1e9;
int N; cin>>N;
assert(1<=N&&N<=max);
vector<int> A(N);
for(int i=0;i<N;i++){
cin>>A[i];
assert(1<=A[i]&&A[i]<=inf);
}
COMinit();
cout<<(same(N,A)+differ(N,A))%MOD<<endl;
}
penguinman