gym102586C Sum Modulo
题意:
给你 \(n,m,k\) 以及\(p_i(1\le i\le n)\) ,保证 \(\sum p_i=1\)
你有一个数 \(X\),一开始 \(X=0\)
每次你会生成一个随机数 \(A\),有 \(p_i\) 的概率 \(A=i\) ,然后令 \(X= (X+A)\bmod m\) 。
问 \(X=k\) 的期望次数。
数据范围:\(2\le m\le 10^{18},1\le n\le \min(500,m-1),1\le k<m\)
solution:
为了方便,我们当成是从 \(k\) 走到 \(0\) ,每次 \(X=X-A\)
首先我们能想到一个基础的 \(dp\) 方程:
\(f(0)=0\)
\(f(i)=1+\sum p_jf((i-j)\bmod m)\)
求 \(f(k)\) 。
暴力高斯消元能得暴力分。一个更好的想法:
每个 \(f(x)\) 都能表示成 \(w_x+\sum a_if(i)\) 的形式。
我们尝试干两件事情:
1.对于每一个 \(f(x)\) 都能把它快速地表示成上述形式。
2.解出 \(f(1),f(2),…,f(n-1)\)
显然做出这两件事就能直接求 \(f(k)\) 了。
先处理第 \(2\) 件事:表示出 \(f(n-m+1)\) 到 \(f(m-1)\) ,然后对于 \(f(1)\) 到 \(f(n-1)\) ,显然就都能以两种方式表示出来,我们就可以列出 \(n-1\) 个方程,高斯消元求解。
再看第 \(1\) 件事。
一个 naive 的做法是直接矩阵快速幂暴力转移,单次都要 \(O(n^3\log m)\) ,过不了。
我们尝试直接用 \(f(x),f(y)\) 得出 \(f(x+y) (x+y<m)\),方法是:
\(f(x)=w_x+\sum a_if(i)\) 是吧。
我们再令 \(f(y)=w_y+\sum b_if(i)\)
那么考虑 \(f(i)->f(x)\) 的这个贡献的系数呀,显然只与 \(x-i\) 有关。
于是 \(f(x+y)=w_x+\sum a_if(i+y)=w_x+w_y\sum a_i+\sum f(i+j)a_ib_j (1\le i,j <n)\)
对于 \(f(2n-2)\) 到 \(f(n)\) ,我们用 \(dp\) 式展开,合并到更小的项即可。
这样,我们就用 \(O(n^2)\) 的复杂度合并了 \(f(x),f(y)\)
于是单个 \(f(x)\) 就能用 \(O(n^2\log m)\) 的复杂度表示出来,具体是先算 \(f(2^i)\) ,再二进制拆分。
但还没做完。对于 \(f(m-n)\) 到 \(f(m-1)\) ,最快的做法是:
先算 \(f(m-n)\) 。
假设算出 \(f(x)\) ,则 \(f(x+1)=w_x+\sum a_if(i+1)\) ,展开 \(f(n)\) 这一项,即可算出 \(f(x+1)\) 。这是单次 \(O(n)\) 的。
于是我们整个题成功的做到了 \(O(n^2(n+\log m))\) 的复杂度。
可能还有一些科技能做这个题,不管了。
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,e[510];
ll m,K;
const int mod=998244353;
int qpow(int a,int b){
int c=1;
for(;b;b>>=1){
if(b&1)c=1ll*a*c%mod;
a=1ll*a*a%mod;
}
return c;
}
struct qq{int p[510],val;}base[62],tk[510],ans[510];
int fz[1010];
qq mul(qq a,qq b){
//f(x+y)=w_x+sum (w_y+sum f(j+i)*cy(j))*cx(i)
//f(x+y)=w_x+w_y* (sum cx(i)+sum cx(i)cy(j)f(i+j)
qq c;c.val=0;
memset(c.p,0,sizeof(c.p));
int as=0;
for(int i=0;i<n;i++)(as+=a.p[i])%=mod;
c.val=(a.val+1ll*as*b.val%mod)%mod;
memset(fz,0,sizeof(fz));
for(int i=0;i<n;i++)for(int j=0;j<n;j++)(fz[i+j]+=1ll*a.p[i]*b.p[j]%mod)%=mod;
for(int i=2*n-2;i>=n;i--){
(c.val+=fz[i])%=mod;
for(int j=1;j<=n;j++)(fz[i-j]+=1ll*e[j]*fz[i]%mod)%=mod;
}
for(int i=0;i<n;i++)c.p[i]=fz[i];
return c;
}
qq fik(ll x){
qq c;bool fl=0;
for(int i=60;i>=0;i--)if((x>>i)&1){
if(!fl)fl=1,c=base[i];
else c=mul(c,base[i]);
}
return c;
}
qq qb(){
qq c;c.val=1;memset(c.p,0,sizeof(c.p));
for(int i=0;i<n;i++){
(c.val+=1ll*e[n-i]*tk[i].val%mod)%=mod;
for(int j=1;j<n;j++)
(c.p[j]+=1ll*e[n-i]*tk[i].p[j]%mod)%=mod;
}
return c;
}
qq ad(qq a){
qq c;c.val=(a.val+a.p[n-1])%mod;
for(int i=0;i<n;i++)
c.p[i]=((i?a.p[i-1]:0)+1ll*a.p[n-1]*e[n-i]%mod)%mod;
return c;
}
int a[510][510];
int main(){
cin>>n>>m>>K;
if(n==1){return printf("%lld",K),0;}
int S=0;
for(int i=1;i<=n;i++)scanf("%d",&e[i]),S+=e[i];
S=qpow(S,mod-2);
for(int i=1;i<=n;i++)e[i]=1ll*e[i]*S%mod;
//f[0]=0
//i>=1 f[i]=1+sum j<=n f[i-j]*e[j]
//求f[K]
base[0].p[1]=1;
for(int i=1;i<=61;i++)base[i]=mul(base[i-1],base[i-1]);
tk[0]=fik(m-n+1);
//m-n+1
//f(x+1)=w_+f_(i+1)*cx_i
for(int i=1;i+1<n;i++)tk[i]=ad(tk[i-1]);
for(int i=1;i<n;i++){
ans[i]=qb();
for(int j=0;j+1<n;j++)tk[j]=tk[j+1];
tk[n-1]=ans[i];
}
for(int i=1;i<n;i++){
a[i][n]=-ans[i].val,a[i][i]--;
for(int j=1;j<n;j++)(a[i][j]+=ans[i].p[j])%=mod;
}
for(int i=1;i<n;i++){
for(int j=i;j<n;j++)if(a[j][i]){swap(a[i],a[j]);break;}
for(int j=1;j<n;j++)if(i!=j){
int tp=1ll*a[j][i]*qpow(a[i][i],mod-2)%mod;
for(int k=i+1;k<=n;k++)(a[j][k]-=1ll*tp*a[i][k]%mod)%=mod;
}
}
qq an=fik(K);
int ans=an.val;
for(int i=1;i<n;i++)(ans+=1ll*an.p[i]*a[i][n]%mod*qpow(a[i][i],mod-2)%mod)%=mod;
return printf("%d",(ans+mod)%mod),0;
}
gym102586C Sum Modulo的更多相关文章
- codeforces 616E Sum of Remainders (数论,找规律)
E. Sum of Remainders time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces Educational Codeforces Round 5 E. Sum of Remainders 数学
E. Sum of Remainders 题目连接: http://www.codeforces.com/contest/616/problem/E Description The only line ...
- Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值
The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar fo ...
- Codeforces 616E - Sum of Remainders
616E Sum of Remainders Calculate the value of the sum: n mod 1 + n mod 2 + n mod 3 + - + n mod m. As ...
- ExaWizards 2019 English D - Modulo Operations(DP)
Time Limit: 2 sec / Memory Limit: 1024 MB Score : 600600 points Problem Statement Snuke has a blackb ...
- CodeForces - 1073E :Segment Sum (数位DP)
You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from ...
- Educational Codeforces Round 7 F. The Sum of the k-th Powers 拉格朗日插值法
F. The Sum of the k-th Powers 题目连接: http://www.codeforces.com/contest/622/problem/F Description Ther ...
- CodeForces - 622F:The Sum of the k-th Powers (拉格朗日插值法求自然数幂和)
There are well-known formulas: , , . Also mathematicians found similar formulas for higher degrees. ...
- Sum of Remainders(数学题)
F - Sum of Remainders Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I ...
- Codeforces 622F The Sum of the k-th Powers
Discription There are well-known formulas: , , . Also mathematicians found similar formulas for high ...
随机推荐
- 多点DLT (Direct Linear Transformation) 算法
阅读前可以先参看上一篇代数视觉博客: 四点DLT (Dierct Linear Transformation) 算法 对于大于4个点的数据点来进行 DLT 算法变换, 如果数据点的标注都十分准确,那么 ...
- linux 内存泄漏检测原理及实现
通过检测内存块是否被引用,而判断内存是否泄漏 参考链接:https://mp.weixin.qq.com/s/_WTpg2rnqIJDRKo-UcfeFA
- CF单机版终极猎手30人版安装教程
本游戏是CF的单机版本,内含终极猎手30人版,可变身四种终极猎手.这个版本只有这一种模式,没有其他的幽灵模式.生化模式.爆破模式.团队模式等等,如果想玩上述的模式,你可以在其他地方找.值得注意的是这个 ...
- killall: command not found
centos7精简安装后,使用中发现没有killall命令.经查找,可以通过以下命令解决:yum install psmisc -y 简单介绍一下 psmisc :Psmisc软件包包含三个帮助管理/ ...
- Dockerfile自定义镜像
一.镜像结构 镜像是将应用程序及其需要的系统函数库.环境.配置.依赖等打包而成 以MySQL为例: 如上图所示,镜像由多个层(Layer)构成,每个层包含不同的内容. 另外,某些层可以单独抽出,组成一 ...
- 078_Sublime HaoIDE 搭建 Lightning Aura环境
随着 Classic 不断的向 1 .HaoIDE->Setting->User Setting 请把以下内容copy进去,修改账号密码token以及项目名称,例子中列举了两个Projec ...
- fastdfs java客户端操作
https://github.com/happyfish100/fastdfs-client-java 到此处下载下来demo 这里采用maven的方式 mvn clean install 上传到本地 ...
- JavaScript基本知识整理(基本包装类型)
基本包装类型 为了方便地操作基本类型变量,ECMAScript规定了3个特殊引用类型分别是Boolean,Number和String. 这三种特殊引用类型同时具有基本类型和引用类型的功能,当我们读取一 ...
- iptables( < deb ufw)
iptables其实不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的netfilter安全框架"中,netfilter位于内核空 ...
- C盘爆红满了怎么办?既然C盘装不下了,那咱给C盘扩容不就完事了吗!
我们在使用电脑的过程中,经常容易出现C盘爆红,反而其他盘还有大量可用空间的情况. 为什么会这样呢?其实主要就两种原因: 一是电脑使用习惯不好,不管什么软件都默认安装在C盘,大文件又喜欢放在桌面,久而久 ...