Wannafly挑战赛6 C逆序对【找规律+详细图解】
来源:互联网 发布:污是什么意思网络用语 编辑:程序博客网 时间:2024/04/28 15:26
逆序对
题目描述
求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位ai和aj(i
输入描述:
输入一个n。
输出描述:
输出答案对1e9+7取模
示例1
输入
3
输出
6
说明
备注:
题意: 略
分析:
正解: 考虑每一位为0的贡献,设当前为第i位,当前则有i-1位,即
即:
可能看了之后不少人都不怎么理解,现在我们来一步一步来分析,首先那长度为4的来分析下,首先一共有
现在我们按位来枚举贡献,从右至左,首先第一位的贡献应该为0,其次第二位见下图:
然后考虑第三位,同理应该也有
同理第四位贡献应为
通项公式找到了就是一个快速幂取模而已
参考代码
#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll MOD = 1e9 + 7;ll quick_pow(ll a, ll b) { ll res = 1; while (b > 0) { if(b &1) { res = res*a % MOD; } b >>= 1; a = a*a % MOD; } return res;}int main() { ll n;cin>>n; cout<<((((n - 1)%MOD) * (n%MOD) /2 )%MOD* quick_pow(2,n-2))% MOD<<endl; return 0;}
- 如有错误或遗漏,请私聊下UP,thx
阅读全文