C-逆序对_Wannafly挑战赛6 (nowcoder.com)
题意:
思路:
组合数学,无非两种做法,一种是计数DP,另一种是组合数
DP显然不可能,那就组合数
考虑组合数的时候可以把这道题变成一个枚举题
我们去枚举位,一共最多1e18位(不是指真的枚举,是按位去计算贡献)
对于一个位,贡献这样计算:
化简一下就是(等差数列):
Code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=1e6+10;
const int mxe=1e6+10;
const int mod=1e9+7;
int n;
int ksm(int a,int b){
int res=1;
while(b){
if(b&1) res=(res*a)%mod;
a=(a*a)%mod;
b>>=1;
}
return res;
}
void solve(){
cin>>n;
if(n==0||n==1) cout<<0<<'\n';
else if(n==2) cout<<1<<'\n';
else cout<<(n%mod)*((n-1)%mod)%mod*ksm(2,n-3)%mod;
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int __=1;//cin>>__;
while(__--)solve();return 0;
}