solution
枚举一个为0的位置,然后想办法统计该位置产生的贡献。显然,一个为0的位置产生的贡献就是它前面1的个数。
如果位置为0,那么他前面共有种可能的序列,每种序列都有个数字,那么总的数字数量就是。显然的,这些数字中0和1的数量应该是相等的。所以其中1的个数就是。然后考虑后面的位置共有种可能的序列,所以x位置产生的每个贡献都有中可能的排列。那么总的贡献就是
所以最终答案就是
code
/* * @Author: wxyww * @Date: 2020-04-15 11:57:07 * @Last Modified time: 2020-04-15 13:54:57 */ #include<cstdio> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> #include<vector> #include<ctime> using namespace std; typedef long long ll; const int mod = 1e9 + 7; ll read() { ll x = 0,f = 1;char c = getchar(); while(c < '0' || c > '9') { if(c == '-') f = -1; c = getchar(); } while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); } return x * f; } ll qm(ll x,ll y) { ll ret = 1; for(;y;y >>= 1,x = x * x % mod) if(y & 1) ret = ret * x % mod; return ret; } int main() { ll n = read(); cout<<(n % mod) * ((n - 1) % mod) % mod * qm(2,n - 3) % mod; return 0; }