题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6595

题目:


给出一个数n,在【1,n】等概率的选择一个数i,在【1,i】内每次等概率的选择一个数字组成长度为i的序列,这个序列中所有数都在【1,i】内,且两两互不相同(也就是说这个长度为i的序列是1->n的一种排列),以这个长度为i的序列为参数array运行程序:

1.统计array中的逆序对数目

2.统计array的子序列的逆序对数目(子序列的长度为0->length(array)),

3.array长度为0结束程序,否则以这个子序列为参数array运行程序,重复1,2

求最终逆序对数目的期望值,对998244353取模

程序如下:

input:

0

1

2

output:

0

332748118

554580197

解题思路:


对于一个长度为n的排列,它共有对数,每对数有的概率是逆序对,故一个长度为n的排列含有的逆序对数目的期望值=

对于一个长度为i的原序列,可以产生个子序列,它的长度为j的子序列有个,且概率都是。对于这个长度为j的子序列,它又可以当作一个原序列得到它的子序列,同理,它的子序列也可以当成一个原序列得到子序列。。。。所以这是一个很的问题,但是我们可以用递推解决,依据是期望的可加性。

对于一个长度为i的原序列,它长度为j的子序列对应的逆序对数目的期望值已经求得,那么在求原序列逆序对的期望值时可以用到这个结果,不难推出下面这个式子:

但是在求f(i)的时候因为有边的式子中也有f(i),而f(i)是未知的,待求的,所以直接用上面这个式子解不出f(i),左右同乘,并移项可以得到如下式子:

这样就可以O()预处理得到所有的长度为i的原序列对应的逆序对数目的期望值,f(i)是取模后的结果

对于输入的x,,每一个i产生的概率是,值是f(i),所以最终结果是

时间复杂度分析:预处理O()9e6,查询O()≤5e4  ,故总的时间复杂度最大为:9e6+5e4

做的时候群里说有人蒙了个公式过了,真的是猛:O(1)的做法,公式是,再取模,求逆元就ok了

ac代码:


#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) ((x)&(-x))
typedef long long ll;
const int maxn = 3005;
const int mod  = 998244353;
ll mu[maxn], zi[maxn], f[maxn], c[maxn][maxn];
ll qkpow(ll a,ll p,ll mod)
{ll t=1,tt=a%mod;while(p){if(p&1)t=t*tt%mod;tt=tt*tt%mod;p>>=1;}return t;
}
ll getInv(ll a,ll mod)
{return qkpow(a,mod-2,mod);
}
void init()
{//组合数for(int i = 1; i < maxn;i++){c[i][i] = 1, c[i][0] =1;for(int j = 1; j < i; j++)c[i][j] = (c[i-1][j] + c[i-1][j-1]) % mod;}//分母mu[1] = 2;for(int i = 2; i < maxn; i++)mu[i] = (mu[i - 1]  * 2) % mod;f[0] = 0, f[1] = 0;for(int i = 2; i < maxn; i++){//或者不用单开一个分子数组,存到f[i]里zi[i] = (c[i][2] * mu[i-1]) % mod;//原序列的逆序对期望值!!不要写成c[i][2]/2 * mu[i-1] 因为c[2][2]/2=0,而应该是0.5for(ll j = 0; j < i; j++)zi[i] = (zi[i] + (c[i][j] * f[j]) % mod) % mod;f[i] = (zi[i] * getInv(mu[i] -1 , mod)) % mod;//得到第二个式子的f[i]//printf("f[%d]: %lld\n", i, f[i]);}
}
int main()
{ios::sync_with_stdio(false);int x;init();while(cin >> x){int ans = 0;for(int i = 1; i <= x; i++)ans = (ans + f[i]) % mod;ans = (ans * getInv(x, mod) ) % mod;cout << ans << endl;}return 0;
}

【2019杭电多校第二场1005 = HDU6595】Everything Is Generated In Equal Probability(期望-递推)相关推荐

  1. 2019杭电多校第二场1009 HDU6599:求本质不同的回文串长度及数量

    hdu6599:求本质不同的回文串长度及数量 hdu6599题意: manacher+后缀自动机+倍增 $O(nlog(n))$ manacher+后缀数组+二分 $O(nlog(n))$ 回文树(回 ...

  2. 20190724杭电多校第二场

    没有补题..倒是又想到了1002的二分做法,比原来好写了不少,也快了不少. #include<bits/stdc++.h> using namespace std; #define p_b ...

  3. 2022“杭电杯”中国大学生算法设计超级联赛 (2) 杭电多校第二场

    题目 1001 Static Query on Tree AC代码 1002 C++ to Python AC代码 1003 Copy AC代码 1005 Slayers Come AC代码 1007 ...

  4. 2020杭电多校第二场 Lead of Wisdom(爆搜)

    Problem Description In an online game, "Lead of Wisdom" is a place where the lucky player ...

  5. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

  6. 2018杭电多校第二场1006(容斥原理,组合数学)

    有能力时再回来解决吧= ̄ω ̄= 转载于:https://www.cnblogs.com/ldudxy/p/9521721.html

  7. 2019杭电多校第一场 Operation HDU - 6579

    题意:给出一个序列,两种操作,求区间[l,r]的区间最大异或和,和在末尾添加一个数 思路:强制在线,保存每个线性基的数值,接下去直接去搜第r个线性基,但要保持时间比l要大,新增了一个pos数组代表一个 ...

  8. 2019杭电多校第九场 Rikka with Cake (hdu6681)

    题意:给出一个n * m的蛋糕,切 k 刀,每次从一个点(x,y)向 上下左右的一个方向切,问最后蛋糕被切成了几块 题解:显然,蛋糕的块数就是那么多线段的交点数 + 1.先离散,考虑向左切和向上切的, ...

  9. 2019杭电多校第一场 HDU 6599

    题解 枚举所有的回文串 注意,本质不同的回文串最多只有∣S∣|S|∣S∣个 在这些回文串中,有一些是满足要求的,我们对这些串打上标记 首先跑一个ManacherManacherManacher,然后枚 ...

  10. 2022杭电多校第二场

    1001 Static Query on Tree 题意:树上有A,B,C三个集合,求有多少个点在A某个点到C某个点的路径与A某个点到C某个点的路径的交上 把1到A集合中所有点的路径打上标记1,把1到 ...

最新文章

  1. Fiat–Shamir heuristic 启发式的应用 理解 代码实现
  2. 戴尔推免费浏览器安全工具 可隔离恶意软件
  3. Linux系统安装DNS域名解析服务
  4. oracle两列合并成一列_POWER QUERY--一个工作簿内的多张工作表合并汇总
  5. 数据结构与算法 | 带头双向循环链表
  6. 华为云电脑和马云无影比_阿里云打造未来电脑无影,却因为5G限制,很难达到普及...
  7. 安卓开发替换json字符串中的数据_22个JavaScript开发技巧合集
  8. 18 个惊人的 GitHub 仓库
  9. 每日10行代码173:测试下yafu的质因数分解能力
  10. 理正深基坑6.0软件备忘录_梳理使用方法01
  11. ERROR: Could not install Gradle distribution from ‘https://services.gradle.org/distributions/gradle-
  12. 2022在线横幅广告_店标_LOGO制作系统最新源码
  13. R语言 生存分析与cox模型的学习笔记
  14. linux系统截图有快捷键吗,Linux下用快捷键截图
  15. bitcoin全节点搭建
  16. wps斜杠日期格式_wps表格,怎样将输入的日期间隔斜线改为横线?
  17. github unable to access 'https://github.com/...: Failed to connect to github.com port 443‘
  18. 如何打造一份优秀的技术简历
  19. 工具nmap常用命令总结
  20. Java课程设计-图书借阅管理系统

热门文章

  1. Mbs Framework 简介
  2. c语言和测绘程序设计,测绘程序设计(C语言版)
  3. 如何安装husky_Ubuntu 14.04 编译安装 husky
  4. 对于elemnet-ui的el-upload的使用总结(移除上传文件判断,action等问题)
  5. 最新最全linux系统调优指南(centos7.X)
  6. 《编程原本 》一1.8 总结
  7. MapXtreme 2005 学习心得 了解新建MapXtreme项目结构(二)
  8. Spring mvc时间格式处理
  9. actionbar与viewpager的联合使用(android 3.0 ,level 11以上)
  10. 转载 JavaScript的24条实用建议