题意

给定一个数组 \(a\),进行 \(k\) 次操作。第 \(i\) 操作等概率随机 \(a\) 中一个元素 \(a_x\),将这个元素的值加入答案,并使其减去 \(a_x\bmod i\) 。问期望乘上 \(n^k\) 的值,对 \(998244353\) 取模。

\(n\le 10^7\),\(k\le17\),\(a_i\le998244353\)。

思路

期望乘上 \(n^k\) 就是所有情况下答案的和。

研究一下每个元素对答案的贡献,发现只和该元素被选中的次数集合有关,与其他元素无关。那么我们分开计算每个元素的贡献。

一个显然的做法是枚举每一次是否选中这个元素,并且计算贡献与方案数。这个 \(O(n2^k)\) 暴力较简单,不多讲。

注意到一个元素对答案的贡献与位置无关,只与值的大小有关,所以可以计算出每一个值对答案的贡献。记 \(f_{i,j}\) 表示有多少种方式使得某元素 \(i\) 次操作后大小为 \(j\)。注意,这里的 DP 相当于对每个元素进行 DP 的过程合并成一个 DP,所以 \(f_{i,j}\) 是所有元素 \(i\) 次操作后变成 \(j\) 的方案数之和。转移方程为 \(f_{i+1,j-j\bmod i}+=f_{i,j}\),\(f_{i+1,j}+=(n-1)f_{i,j}\) 最后对于每个 \(f_{i,j}\) 计算贡献。

如何优化?这里有一个很妙的做法:观察性质,每次操作对元素的影响是减去 \(a_j\bmod i\),这样的影响,最多也不会减去超过 \(a_j\bmod \mbox{lcm}_{i=1}^ki\)。为什么?因为任意 \(1\le i\le k\) 都是 \(\mbox{lcm}_{i=1}^ki\) 的因数,所以无论何时都有 \(a_j\bmod i\le a_j\bmod \mbox{lcm}_{i=1}^ki\)。那么我们只需要 DP \(a_j\bmod \mbox{lcm}_{i=1}^ki\) 的部分,而其他部分是不会随操作改变的,直接 \(O(n)\) 计算贡献即可。总复杂度 \(O(n+k\mbox{lcm}_{i=1}^ki)\)。

实现

直接 DP 的话空间开不下,可以选择滚动数组,也可以根据转移的方向开单个数组,同时卡时空常数。具体见代码。

inline void Calc(int x){
MAdd(ans,Mul(x/l*l,Mul(m,pn[m-1])));
MAdd(f[x%l],1);
} int main(){
l=1;
n=Read();
a[1]=Read();
int x=Read(),y=Read();
m=Read();
int mod=Read();
pn[0]=1;
for(int i=1;i<m;++i)
l=l/Gcd(l,i)*i,pn[i]=Mul(pn[i-1],n);
Calc(a[1]);
for(int i=2;i<=n;++i)
a[i]=(1ll*a[i-1]*x+y)%mod,Calc(a[i]);
for(int i=1;i<=m;++i)
for(int j=0;j<l;++j){
MAdd(ans,Mul(Mul(f[j],j),pn[m-i]));
if(i<m){
if(j%i)
MAdd(f[j-j%i],f[j]),f[j]=Mul(f[j],n-1);
else
f[j]=Mul(f[j],n);
}
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. md语法之行内代码和代码片
  2. POJ 1014 Dividing(多重背包)
  3. GO语言练习:switch基本用法
  4. web前端性能概述
  5. 6、android开发中遇到的bug整理
  6. GPIO模拟串口注意是事项
  7. Java基础知识强化之集合框架笔记04:Collection集合的基本功能测试
  8. Java 日期字符串与日期类型转换
  9. 华为OJ培训主题 比赛统计
  10. php自定义函数求取平方根
  11. 可能是最全面的G1学习笔记
  12. Python爬虫之诗歌接龙
  13. Hive数据仓库工具安装
  14. 【BZOJ5197】Gambling Guide (最短路,期望)
  15. Unique Morse Code Words
  16. 《Java程序设计》第二周学习记录(1)
  17. Python基础:一、编程语言分类
  18. BZOJ4808马——二分图最大独立集
  19. oracle数据库连接不上
  20. shell学习(四)

热门文章

  1. python利用matplotlib生成迷宫
  2. 工作这么多年,我总结的数据传输对象 (DTO) 的最佳实践
  3. C Primer Plus (6.16) 編程練習
  4. angular 引入服务报错global is not defined----angular11引入service报错Can&#39;t resolve &#39;@core/net/aa/aa.service&#39; in &#39;D:\pro&#39;
  5. 通过一个示例形象地理解C# async await异步
  6. 你知道CDN是干嘛的吗?
  7. 【Rust学习】内存安全探秘:变量的所有权、引用与借用
  8. 带你动手做AI版的垃圾分类
  9. [Windows] 微信超级管家,自动好友回复、计数、自动同意、群发、好友导出、消息日志、无限多开
  10. (原创)【B4A】一步一步入门03:APP名称、图标等信息修改