逆序对

逆序对

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

相关推荐

02-28 01:18
已编辑
南昌大学 后端工程师
黑皮白袜臭脚体育生:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
03-13 14:21
已编辑
江西警察学院 前端工程师
站队站对牛:红红一大片 天都要塌了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务