题解:CF57C Array
题解:CF57C Array
题意
给定
- 长
n - 以不大于
n 的正整数组成 - 单调不降或单调不升
分析
显然单调不降的序列个数与单调不升的序列个数相等(只要左右翻转过来就能重合)
那么只要我们能求出单调不降的序列个数
考虑如何求单调不降的序列个数,首先我想到了动态规划。设
但这样显然会超时,于是我们观察状态转移方程:
变形:
代入:
这个式子和杨辉三角的式子很像,为了更直观,下面给出
1 1 1 1
1 2 3 4
1 3 6 10
1 4 10 20
这里就很显然了,
于是我们可以
代码
// Array (AC)
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int N = 1e5 + 5;
ll n, jie[N << 1];
ll ksm(ll a, ll t)
{
ll res = 1;
while (t)
{
if (t & 1)
res = res * a % mod;
a = a * a % mod;
t >>= 1;
}
return (res + mod) % mod;
}
ll c(int n, int m)
{
return jie[n] * ksm(jie[m], mod - 2) % mod * ksm(jie[n - m], mod - 2) % mod;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n;
jie[0] = 1;
for (ll i = 1; i <= n * 2; i ++)
jie[i] = jie[i - 1] * i % mod;
cout << (c(n * 2 - 1, n - 1) * 2 % mod + mod - n) % mod << endl;
return 0;
}