题意:
解法:
显 然 n = 1 时 答 案 为 0 , 下 面 考 虑 n > = 2 的 情 况 : 考 虑 第 i 位 为 0 时 , 所 有 长 度 为 n 的 串 中 一 共 有 多 少 个 1 在 [ 1 , i − 1 ] 位 . 因 为 每 一 位 只 有 0 和 1 两 种 情 况 , 因 此 最 终 0 和 1 的 数 量 是 相 同 的 , 所 以 [ 1 , i − 1 ] 位 1 的 个 数 为 ( i − 1 ) ∗ 2 i − 1 / 2 , 即 ( i − 1 ) ∗ 2 i − 2 , 满 足 第 i 位 为 0 的 串 共 有 2 n − i 个 ( 就 是 后 面 n − i 位 任 意 取 的 方 案 数 ) , 因 此 第 i 位 为 0 对 答 案 的 贡 献 为 ( i − 1 ) ∗ 2 i − 2 ∗ 2 n − i = ( i − 1 ) ∗ 2 n − 2 . a n s = ∑ i = 2 n ( i − 1 ) ∗ 2 n − 2 = 2 n − 2 ∑ i = 2 n ( i − 1 ) = [ ( n − 1 ) ∗ n / 2 ] ∗ 2 n − 2 . 显然n=1时答案为0,下面考虑n>=2的情况:\\考虑第i位为0时,所有长度为n的串中一共有多少个1在[1,i-1]位.\\ 因为每一位只有0和1两种情况,因此最终0和1的数量是相同的,\\ 所以[1,i-1]位1的个数为(i-1)*2^{i-1}/2,即(i-1)*2^{i-2},\\ 满足第i位为0的串共有2^{n-i}个(就是后面n-i位任意取的方案数),\\ 因此第i位为0对答案的贡献为(i-1)*2^{i-2}*2^{n-i}=(i-1)*2^{n-2}.\\ ans=\sum_{i=2}^n(i-1)*2^{n-2}=2^{n-2}\sum_{i=2}^n(i-1)\\=[(n-1)*n/2]*2^{n-2}.\\ 显然n=1时答案为0,下面考虑n>=2的情况:考虑第i位为0时,所有长度为n的串中一共有多少个1在[1,i−1]位.因为每一位只有0和1两种情况,因此最终0和1的数量是相同的,所以[1,i−1]位1的个数为(i−1)∗2i−1/2,即(i−1)∗2i−2,满足第i位为0的串共有2n−i个(就是后面n−i位任意取的方案数),因此第i位为0对答案的贡献为(i−1)∗2i−2∗2n−i=(i−1)∗2n−2.ans=i=2∑n(i−1)∗2n−2=2n−2i=2∑n(i−1)=[(n−1)∗n/2]∗2n−2.
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int ppow(int a,int b,int mod){
int ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
signed main(){
int n;cin>>n;
if(n==1){
cout<<0<<endl;
}else{
int ans=(n%mod)*(n%mod-1+mod)%mod*ppow(2,mod-2,mod)%mod;
ans=ans*ppow(2,n-2,mod)%mod;
cout<<ans<<endl;
}
return 0;
}