题号 NC14731 名称 逆序对
逆序对
http://www.nowcoder.com/questionTerminal/1e3eb598c8ca4631ae2f9ce9016470ec
题目相对比较容易,就是找一对 i j 然后a[i] = 1, a[j] = 0 。
可以发现,只要存在一对这样的对子,那么剩下的不管怎么变化它都会对ans进行贡献,那么剩下的 n-2 个元素就可以组成 2^(n-1) ,ans= C(n,2)*2^(n-1).
#include <bits/stdc++.h> #define MAX_INT ((unsigned)(-1)>>1) #define MIN_INT (~MAX_INT) #define db printf("where!\n"); #define pb push_back using namespace std; #define ll long long ll gcd(ll x,ll y){return y ? gcd(y,x%y) : x;} template<class T>inline void read(T &res){ char c;T flag=1; while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0'; while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag; } const ll mod=1e9+7; ll qp(ll a,ll b) { ll ans=1; while(b) { if(b&1)ans=(ans*a)%mod; a=(a*a)%mod;b>>=1; } return ans; } int main() { ll n;read(n); if(n==1) cout<<0; else cout<<((((n%mod)*((n-1)%mod)/2)%mod)*(qp(2,n-2)%mod))%mod; return 0; }