题解[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 ...
随机推荐
- Python 内置界面开发框架 Tkinter入门篇
本文大概 4158 个字,阅读需花 10 分钟 内容不多,但也花了一些精力 如要交流,欢迎关注我然后评论区留言 谢谢你的点赞收藏分享 首先,今天先给大家拜个好年!新年快乐,恭喜发财!为了感谢大家对我的 ...
- vue/cli子组件style中如何使用全局图片路径
- NAPT网络结构下TCP/UDP/ICMP访问外网原理思考
背景 作为程序员,应该都听说过NAT(Network Address Transfer,网络地址转换)这一技术名词,并或多或少大概知道其原理与作用--NAT是用于解决IPv4地址不够用,保证我们能够在 ...
- .Net6 使用 Ocelot + Consul 看这篇就够了
前言 卯兔敲门,新的一年,祝大家前'兔'似锦!希望大家假后还能找到公司的大门 O(∩_∩)O !书接上文,我们使用了 Consul实现了服务注册与发现,对Consul不熟悉的同学可以先看看.这篇文章我 ...
- Hive删除分区名称中含有特殊字符
先说方案:通过show partitions和hdfs url看到的都不是真正的分区名称,都是经过URI重新编码的,访问这些分区应该使用分区名称的原始字符串. 场景描述 当我们在SQL语句中使用变量时 ...
- [Vue warn]: Invalid prop: type check failed for prop "model". Expected Object, got String with value ""
问题描述: [Vue warn]: Invalid prop: type check failed for prop "model". Expected Object, got S ...
- SRE:如何提高报警有效性?
为什么要提升<报警有效性> 过多的报警会让负责人麻木 过多的报警会增加短信和电话的成本 提升根因定位效率 如何定义<报警有效性> 不漏报 不误报 不重报 不延报 如何量化 MT ...
- PostGIS之空间关系
1. 概述 PostGIS 是PostgreSQL数据库一个空间数据库扩展,它添加了对地理对象的支持,允许在 SQL 中运行空间查询 PostGIS官网:About PostGIS | PostGIS ...
- PYTHON编写程序练习-打印99乘法表
使用for循环嵌套的知识点编写 for i in range(1,10): #第一层循环,循环乘数 for j in range(1,i+1): #第二层循环,循环被乘数 print(f&qu ...
- LeetCode-1606 找到处理请求最多的服务器
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/find-servers-that-handled-most-number-of-requests ...