solution:
大佬们一看到1e18就知道要找规律,本菜鸡还想着递推。
方法一:
刘大佬说可以在n个位置里找出2个组成1 0,有 种方案,其它位置有
种可能,答案就是
*
。这太神仙了,递推菜鸡的我看了好久。刘大佬原话----0就是没有贡献,1的话会在选这个位置是1后面是0算到。
看了邓老师的题解后感觉自己傻到了,比刘大佬的说法更清楚,就是选出一对逆序对,他能对个01串做出贡献,而01的逆序对可以找出
个,那有这个逆序对的01串里还有逆序对不用算吗,是不用的,已经在求别的方案的时候就算到了。
方法二:
可以枚举每个位置i的贡献,第i个位置为1时没有贡献,为0时的贡献为前i-1个位置1的个数,前i-1个位置有 种可能,因为1和0出现的概率是一样的,共有(i-1)/2个1,
个串包含这前i个数。
答案就是 (i-1) *
=n(n-1) *
Code:
#include<bits/stdc++.h>
#define ll long long
#define js ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
const int mod = 1e9+7;
ll qpow(int a,int b) {
ll ans=1;
while(b) {
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
}
int main() {
ll n; js;
cin>>n;
if(n>2) {
ll ans=n%mod*(n-1)%mod*qpow(2,n-3);
cout<<ans<<endl;
}
else if(n==1) cout<<"0\n";
else cout<<"1\n";
}
京公网安备 11010502036488号