結果
| 問題 |
No.2048 L(I+D)S
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2022-08-19 22:51:45 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 94 ms / 2,000 ms |
| コード長 | 1,802 bytes |
| コンパイル時間 | 4,698 ms |
| コンパイル使用メモリ | 256,664 KB |
| 最終ジャッジ日時 | 2025-01-31 01:33:02 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 16 |
ソースコード
#include <stdio.h>
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace atcoder;
using mint = modint998244353;
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf32 1000000001
#define Inf64 4000000000000000001
int get(vector<int> a){
vector<int> dp(a.size(),0);
rep(i,a.size()){
vector<int> ndp = dp;
rep(j,a.size()){
if(j>a[i])break;
ndp[a[i]] = max(ndp[a[i]],dp[j]+1);
}
swap(dp,ndp);
}
int ret = 0;
rep(i,dp.size())ret = max(ret,dp[i]);
return ret;
}
struct combi{
deque<mint> kaijou;
deque<mint> kaijou_;
combi(int n){
kaijou.push_back(1);
for(int i=1;i<=n;i++){
kaijou.push_back(kaijou[i-1]*i);
}
mint b=kaijou[n].inv();
kaijou_.push_front(b);
for(int i=1;i<=n;i++){
int k=n+1-i;
kaijou_.push_front(kaijou_[0]*k);
}
}
mint combination(int n,int r){
if(r>n)return 0;
mint a = kaijou[n]*kaijou_[r];
a *= kaijou_[n-r];
return a;
}
mint junretsu(int a,int b){
mint x = kaijou_[a]*kaijou_[b];
x *= kaijou[a+b];
return x;
}
mint catalan(int n){
return combination(2*n,n)/(n+1);
}
};
int main() {
// cout<<get({0,1})<<endl;
long long n;
cin>>n;
if(n<=3)cout<<0<<endl;
else{
mint ans = 0;
combi C(3000000);
n-=4;
rep(i,n+1){
int nn = i,kk = n-i;
mint t = 1;
t *= kk+1;
t *= nn + kk + 4;
t *= C.kaijou[nn+kk+2];
t /= C.kaijou[kk+2];
t /= C.kaijou[nn+1] + C.kaijou[nn];
t *= t;
ans += t;
}
cout<<ans.val()<<endl;
}
return 0;
vector<int> t(n);
rep(i,t.size()){
t[i] = i;
}
vector<int> cnt(n+1,0);
do{
vector<int> rt(t.rbegin(),t.rend());
int x = get(t);
int y = get(rt);
if(x+y==n){
cnt[x]++;
}
}
while(next_permutation(t.begin(),t.end()));
rep(i,n+1){
cout<<i<<':'<<cnt[i]<<endl;
}
return 0;
}
沙耶花