题目:

求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位ai和aj(i<j),则ai=1,aj=0。
答案对1e9+7取模。


做法:

由于到了。递推都做不了了,唯有推柿子大法。
考虑每一位和前面的位对答案的贡献。
位上的0对答案无贡献。
位上的1对答案的贡献是前位上0的数量。
位形成个01串,每个串长。所以共有个数字。其中0和1各占一半!所以前位上0的数量:。而后面的位是0是1对当前第位的贡献没有影响,直接把乘进去即可。
所以第的贡献就是。(第i位上的1配上前i-1位上的0)
考虑每一位的贡献:
快速幂求解即可。
PS:特判掉。


代码:

#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false), cin.tie(0)
#define debug(a) cout << #a ": " << a << endl
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
ll ksm(ll x, ll y){
    ll ans = 1;
    while (y){
        if (y&1) ans = ans*x%mod;
        x = x*x%mod;
        y >>= 1;
    }
    return ans;
}
ll mul(ll x, ll y){
    x %= mod, y %= mod;
    return x*y%mod;
}
int main(void){
    IOS;
    ll n; cin >> n;
    if (n <= 1) cout << 0 << endl;
    else if (n == 2) cout << 1 << endl;
    else cout << mul(mul(n, n-1), ksm(2, n-3)) << endl;
    return 0;
}