每日一题 4.16 逆序对
逆序对
https://ac.nowcoder.com/acm/problem/14731
这是一道比较简单的组合数学题
首先我们这么想 在n个位置选出两个位置来按放 1 0 为 (nn-1)/2
其他位置随便放 结果为 2^n-2
最终结果为 (2^n-2)((n*n-1)/2) 然后在计算中取模
仔细想一想这样是将所有情况全部都计算了(想不明白建议手推一下
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll const mod=1e9+7;
ll quickpow(ll a, ll b) {///模板
if (b < 0) return 0;
ll ret = 1;
a %= mod;
while(b) {
if (b & 1) ret = (ret * a) % mod;
b >>= 1;
a = (a * a) % mod;
}
return ret;
}
ll n,k;
int main()
{
scanf("%lld",&n);
k=(((((n%mod)*((n-1)%mod))/2)%mod)*quickpow(2,n-2))%mod;///取模
printf("%lld",k);
return 0;
}
每日一题题解 文章被收录于专栏
每日一题题解的汇集
腾讯成长空间 1169人发布