题解[CF1628F]A_Random_Code_Problem
题意
给定一个数组 \(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;
}
题解[CF1628F]A_Random_Code_Problem的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- CSS中知
1CSS特性 1.3优先级 1.4权重叠加计算 2Chrome调试工具 2.1查错流程 3CSS盒子模型 3.1内容的宽度和高度 3.2边框(border)-连写形式 ...
- appium如何连接多台设备
我们在做app自动化的时候,若要考虑兼容性问题,需要跑几台设备,要是一台一台的跑比较耗 时,因此需要考虑使用多线程来同时操作多台设备. 1.我们拿两台设备来模拟操作下,使用:adb devices查看 ...
- 把KMP算法嚼碎了喂给你吃!(C++)
相信不少人在学数据结构的时候都被KMP算法搞的迷迷糊糊的,原理看的似懂非懂,代码写不出来,或者写出来了也不知道为什么就可以这么写.本文力求尽可能通俗详细的讲解KMP算法,让你不再受到KMP算法的困扰. ...
- Redis 正则扫描key并删除
扫描key /** * @param key * @return * @Description: 通过Scan的方式迭代key */ public Set<String> scanKeys ...
- JDK9对集合添加的优化-Debug追踪
JDK9对集合添加的优化 通常,我们在代码中创建一个集合(例如,List或Set ),并直接用一些元素填充它.实例化集合,几add方法调用,使得代码重复. package A_Lian_one.dem ...
- Unity项目优化——Web版
Unity项目优化--Web版 大家好,这是小黑第一次写文章(哈哈哈哈哈,好激动),我好好的写,有不对的地方多多指出. 首先呢是版本介绍,不过好像版本对于优化没有影响: 不过还是要告诉大家我用的版本: ...
- java介绍、环境搭建与Hello,World!
java的诞生 C与C++ C语言 1972年贝尔实验室 操作系统.编译器等偏底层应用 指针和内存管理漏洞 C++ 1982年 面向对象 对C兼容 在图形领域.游戏领域等方面常用 java 桌面.手机 ...
- 【一句话】Redis的3中缓存策略
首先一句话: 旁路缓存模式策略:写->写DB,删缓存,读->读cache,没有则读DB,然后更新到缓存 读写穿透策略:写->写缓存,然后由缓存系统写DB,读->读cache,没 ...
- Seleniumweb自动化测试01
1.selenium简介 selenium是python的一个web第三方包,主要使用来做web自动化测试的 环境要求: ①.要有谷歌浏览器 ②.下载谷歌浏览器的驱动chromedriver(驱动我们 ...
- 安装CUDA
https://developer.nvidia.com/cuda-toolkit-archive 使用deb安装的话,有时会报错: dpkg: 处理软件包 nvidia-driver-450 (-- ...