Wannafly挑战赛6 C逆序对【找规律+详细图解】

来源:互联网 发布:污是什么意思网络用语 编辑:程序博客网 时间:2024/04/28 15:26

逆序对

题目描述

求所有长度为n的01串中满足如下条件的二元组个数:
设第i位和第j位分别位ai和aj(i

输入描述:

输入一个n。

输出描述:

输出答案对1e9+7取模

示例1

输入

3

输出

6

说明

这里写图片描述

备注:

n<=1018

题意: 略

分析:
正解: 考虑每一位为0的贡献,设当前为第i位,当前则有i-1位,即2i1个数,根据0和1的个数应该相同,那么1的个数为这些数总数的一半,即(i1)2i2。这样的数字共有2ni(即后面的位数),所以每一位的贡献是i2i2总的个数为:
ni=22n2
即:n(n1)2×2n2

可能看了之后不少人都不怎么理解,现在我们来一步一步来分析,首先那长度为4的来分析下,首先一共有24见下图×
这里写图片描述
现在我们按位来枚举贡献,从右至左,首先第一位的贡献应该为0,其次第二位见下图:
这里写图片描述
然后考虑第三位,同理应该也有23个串为1,后面为0的个数应该为22×2
同理第四位贡献应为 22×3,这样应该就可以很好的理解正解上面说的那个公式了
通项公式找到了就是一个快速幂取模而已

参考代码

#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
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天水三千 天水旅行社 天水养猪场 天水讼 天水做网站 天水至西安 天水旅游社 天水大酒店 天水一中 天水三日游 天水卦 天水站 天水人才网 天水人口 天水旅行团 天水麻辣烫 甘肃 天水 天水旅游网 天水招待所 天水海拔 天水 陇南 西宁到天水 天水至陇南 天水到银川 重庆到天水 酒泉到天水 天水信用卡 天水 医院 天水自助游 天水到陇南 科天水漆 甘肃省天水 213天水 天水至渭南 天水至酒泉 天水-武汉 天水 陇西 天水眼镜店 合肥-天水 天水到宝鸡 临汾至天水