题号 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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务