逆序对
逆序对
http://www.nowcoder.com/questionTerminal/1e3eb598c8ca4631ae2f9ce9016470ec
题意:给定长度,问可以得到的
序列个数。
题解: 先考虑了很久没看数据范围,看到后开始找技巧。
首先考虑枚举每种逆序对的个数, 任取,那么使
对答案的贡献就是
,因此只要任取两个合法位置即可即
。则答案就是
自然有模则想到快速幂,对于的计算,如果直接做必然要考虑逆元,那么这里可以先除
后再取模乘可以避免求逆元。
注意坑点当n=1时直接考虑答案为0,代入快速幂后会死循环。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
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; scanf("%lld", &n);
if(n == 1) return 0 * printf("0\n");
ll a = n, b = n - 1;
if(a & 1) swap(a, b);
a /= 2;
ll res = a % mod * (b % mod) % mod;
res = res * qp(2, n - 2) % mod;
printf("%lld\n", res);
return 0;
} 
联想公司福利 1481人发布