結果

問題 No.1193 Penguin Sequence
ユーザー 沙耶花沙耶花
提出日時 2020-08-22 17:17:30
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 292 ms / 2,000 ms
コード長 2,791 bytes
コンパイル時間 2,497 ms
コンパイル使用メモリ 215,056 KB
実行使用メモリ 13,148 KB
最終ジャッジ日時 2024-10-15 11:12:40
合計ジャッジ時間 11,924 ms
ジャッジサーバーID
(参考情報)
judge2 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 234 ms
13,016 KB
testcase_01 AC 292 ms
12,888 KB
testcase_02 AC 292 ms
13,016 KB
testcase_03 AC 290 ms
13,016 KB
testcase_04 AC 290 ms
13,012 KB
testcase_05 AC 290 ms
13,020 KB
testcase_06 AC 289 ms
13,016 KB
testcase_07 AC 290 ms
13,140 KB
testcase_08 AC 290 ms
13,016 KB
testcase_09 AC 291 ms
13,012 KB
testcase_10 AC 291 ms
13,016 KB
testcase_11 AC 174 ms
12,296 KB
testcase_12 AC 173 ms
12,272 KB
testcase_13 AC 253 ms
12,780 KB
testcase_14 AC 237 ms
12,604 KB
testcase_15 AC 276 ms
12,840 KB
testcase_16 AC 222 ms
13,148 KB
testcase_17 AC 2 ms
5,248 KB
testcase_18 AC 45 ms
11,776 KB
testcase_19 AC 285 ms
13,004 KB
testcase_20 AC 230 ms
12,588 KB
testcase_21 AC 189 ms
12,340 KB
testcase_22 AC 49 ms
11,648 KB
testcase_23 AC 159 ms
12,260 KB
testcase_24 AC 142 ms
12,080 KB
testcase_25 AC 76 ms
12,008 KB
testcase_26 AC 37 ms
11,776 KB
testcase_27 AC 245 ms
12,636 KB
testcase_28 AC 179 ms
12,308 KB
testcase_29 AC 253 ms
12,772 KB
testcase_30 AC 100 ms
12,084 KB
testcase_31 AC 86 ms
11,912 KB
testcase_32 AC 201 ms
12,504 KB
testcase_33 AC 147 ms
12,100 KB
testcase_34 AC 123 ms
12,024 KB
testcase_35 AC 151 ms
12,228 KB
testcase_36 AC 120 ms
12,016 KB
testcase_37 AC 240 ms
12,752 KB
testcase_38 AC 24 ms
11,648 KB
testcase_39 AC 24 ms
11,648 KB
testcase_40 AC 24 ms
11,648 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
using namespace std;
#define modulo 998244353
#define mod(mod_x) ((((long long)mod_x+modulo))%modulo)
#define Inf 1000000005


	int beki(long long a,long long b,int M = modulo){
	int x = 1;
	while(b!=0){
		if(b&1){
			x=((long long)x*a)%M;
		}
		a=((long long)a*a)%M;
		b>>=1;
	}
	return x;
}


int gyakugen(int a){
	return beki(a,modulo-2);
}

struct combi{
	deque<int> kaijou;
	deque<int> kaijou_;
	
	combi(int n){
		kaijou.push_back(1);
		for(int i=1;i<=n;i++){
			kaijou.push_back(mod(kaijou[i-1]*i));
		}
		
		int b=gyakugen(kaijou[n]);
		
		kaijou_.push_front(b);
		for(int i=1;i<=n;i++){
			int k=n+1-i;
			kaijou_.push_front(mod(kaijou_[0]*k));
		}
	}
	
	int combination(int n,int r){
		if(r>n)return 0;
		int a = mod(kaijou[n]*kaijou_[r]);
		a=mod(a*kaijou_[n-r]);
		return a;
	}
	
	int junretsu(int a,int b){
		int x = mod(kaijou_[a]*kaijou_[b]);
		x=mod(x*kaijou[a+b]);
		return x;
	}
	
	int catalan(int n){
		return mod(combination(2*n,n)*gyakugen(n+1));
	}
	
};

template <typename T>
struct BIT{
	vector<T> v;
	int n;
	
	T init_value = 0;
	
	BIT(int sz=0){
		n=sz+1;
		v.resize(n,init_value);
	}
	
	BIT(vector<T> &x){
		n=x.size()+1;
		v.resize(n,init_value);
		
		for(int i=0;i<x.size();i++){
			add(i,x[i]);
		}
		
	}

	void add(int x,T val){
		x++;
		while(x < n){
			v[x] = func(v[x],val);
			x += x & (-x);
		}
	}
	
	//区間[0,r)におけるクエリ処理
	T query(int r){
		T ret = init_value;
		
		while(r>0){
			ret = func(v[r],ret);
			r -= r & (-r);
		}
		
		return ret;
	}
	
	T query(int l,int r){
		return mod(query(r) - query(l));
	}
	
	T func(T a,T b){
		return mod(a+b);
	}
	
	int size(){
		return n-1;
	}
	
};

int main(){
	
	int N;
	cin>>N;
	
	if(N==1){
		cout<<0<<endl;
		return 0;
	}
	
	vector<int> A(N);
	for(int i=0;i<N;i++)cin>>A[i];
	int sum = 0;
	{
		vector<int> t = A;
		sort(t.begin(),t.end());
		t.erase(unique(t.begin(),t.end()),t.end());
		
		for(int i=0;i<N;i++){
			A[i] = distance(t.begin(),lower_bound(t.begin(),t.end(),A[i]));
		}
		
		vector<int> B = A;
		sort(B.begin(),B.end());
		for(int i=0;i<N;i++){
			sum = mod(sum + distance(upper_bound(B.begin(),B.end(),A[i]),B.end()));
		}
		
	}
	
	int ans = 0;
	combi C(1000000);
	int S = 1;
	for(int i=1;i<=N;i++){
		S = mod(S * C.combination(N,i));
	}

	int t = 0;
	for(int i=1;i<=N;i++){
		int x = mod(C.combination(N-1,i-1)*gyakugen(C.combination(N,i)));
		int y = mod(x);
		y = mod(y * S);
		y = mod(y * sum);

		ans = mod(ans + mod(y*t));
		t = mod(t + x);

	}
	
	int B = 0;
	{
		BIT<int> b(N);
		
		for(int i=0;i<N;i++){
			B = mod(B + b.query(A[i]+1,N));
			b.add(A[i],1);
		}
	}
	
	for(int i=2;i<=N;i++){
		int x = mod(S * gyakugen(C.combination(N,i)));
		x = mod(x * C.combination(N-2,i-2));
		ans = mod(ans + mod(B*x));
	}
	
	cout<<ans<<endl;

	
	return 0;
}
0