2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)
传送门
一道不错的矩阵快速幂优化dpdpdp。
设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个三滴血的。
显然是可以从f[i−1]f[i-1]f[i−1]转移过来的。
但是仔细一想,这个递推关系在i=1i=1i=1~nnn的时候都是一样的,于是把后面三个状压上矩阵快速幂优化就行了。
直接转是O(T∗size3log)O(T*size^3log)O(T∗size3log)的。
于是可以用倍增的思想预处理出logloglog个数组,最后乘起来,由于结构相同可以做到O(size∗size∗logn∗T+size∗size∗size∗logn)O(size*size*log_n*T+size*size*size*log_n)O(size∗size∗logn∗T+size∗size∗size∗logn)
注意卡常优化。
代码:
#include<bits/stdc++.h>
#define Len 170
#define mod 998244353
#define ll unsigned long long
using namespace std;
int T,m,K,id[15][15][15],tot=0;
ll inv[15],ans[Len],n,tmp[Len];
const ll inf=16940360401038606353llu;
inline ll read(){
ll ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
inline void write(const ll&x){
if(x>9)write(x/10);
putchar((x-x/10*10)^48);
}
struct Matrix{
ll val[Len][Len];
inline void init(){memset(val,0,sizeof(val));}
}f[65];
inline Matrix operator*(const Matrix&a,const Matrix&b){
Matrix ret;
ret.init();
for(int i=1;i<=tot+1;++i)for(int k=1;k<=tot+1;++k)
for(int j=1;j<=tot+1;++j){{
ret.val[i][j]+=a.val[i][k]*b.val[k][j];
if(ret.val[i][j]>=inf)ret.val[i][j]-=inf;
}
}
for(int i=1;i<=tot+1;++i)for(int j=1;j<=tot+1;++j)ret.val[i][j]%=mod;
return ret;
}
inline void update(const Matrix&a){
memset(tmp,0,sizeof(tmp));
for(int i=1;i<=tot+1;++i){
for(int j=1;j<=tot+1;++j){
tmp[i]+=ans[j]*a.val[j][i];
if(tmp[i]>=inf)tmp[i]-=inf;
}
tmp[i]%=mod;
}
memcpy(ans,tmp,sizeof(tmp));
}
int main(){
T=read(),m=read(),K=read(),inv[0]=inv[1]=1;
for(int i=2;i<=10;++i)inv[i]=(mod-mod/i)*inv[mod%i]%mod;
for(int i=0;i<=K;++i)for(int j=0;j<=(m>1?K-i:0);++j)for(int k=0;k<=(m>2?K-i-j:0);++k)id[i][j][k]=++tot;
for(int i=0;i<=K;++i)for(int j=0;j<=(m>1?K-i:0);++j)for(int k=0;k<=(m>2?K-i-j:0);++k){
int pos=id[i][j][k],t=(i+j+k)<K;
if(m==1)if(i)f[0].val[pos][id[i-1][j][k]]=inv[i+1]*i%mod;
if(m==2){
if(i)f[0].val[pos][id[i-1][j][k]]=inv[i+j+1]*i%mod;
if(j)f[0].val[pos][id[i+1][j+t-1][k]]=inv[i+j+1]*j%mod;
}
if(m==3){
if(i)f[0].val[pos][id[i-1][j][k]]=inv[i+j+k+1]*i%mod;
if(j)f[0].val[pos][id[i+1][j-1][k+t]]=inv[i+j+k+1]*j%mod;
if(k)f[0].val[pos][id[i][j+1][k+t-1]]=inv[i+j+k+1]*k%mod;
}
f[0].val[pos][pos]=f[0].val[pos][tot+1]=inv[i+j+k+1];
}
f[0].val[tot+1][tot+1]=1;
for(int i=1;i<=63;++i)f[i]=f[i-1]*f[i-1];
while(T--){
n=read(),memset(ans,0,sizeof(ans));
switch(m){
case 1:ans[id[1][0][0]]=1;break;
case 2:ans[id[0][1][0]]=1;break;
case 3:ans[id[0][0][1]]=1;break;
}
for(int i=0;n;n>>=1,++i)if(n&1)update(f[i]);
write(ans[tot+1]),puts("");
}
return 0;
}
2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)的更多相关文章
- 2018.10.22 bzoj1009: [HNOI2008]GT考试(kmp+矩阵快速幂优化dp)
传送门 f[i][j]f[i][j]f[i][j]表示从状态"匹配了前i位"转移到"匹配了前j位"的方案数. 这个东西单次是可以通过跳kmp的fail数组得到的 ...
- LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】
LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...
- LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)
哇这题剧毒,卡了好久常数才过T_T 设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \ ...
- [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)
世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图) 然后大力枚举每个换 ...
- 2018.10.23 bzoj1297: [SCOI2009]迷路(矩阵快速幂优化dp)
传送门 矩阵快速幂优化dp简单题. 考虑状态转移方程: f[time][u]=∑f[time−1][v]f[time][u]=\sum f[time-1][v]f[time][u]=∑f[time−1 ...
- 2018.10.19 NOIP模拟 硬币(矩阵快速幂优化dp)
传送门 不得不说神仙出题人DZYODZYODZYO出的题是真的妙. f[i][j][k]f[i][j][k]f[i][j][k]表示选的硬币最大面值为iii最小面值不小于jjj,总面值为kkk时的选法 ...
- 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
传送门 首先按照题意构造出转移矩阵. 然后可以矩阵快速幂求出答案. 但是直接做是O(n3qlogm)O(n^3qlogm)O(n3qlogm)的会TTT掉. 观察要求的东西发现我们只关系一行的答案. ...
- 【六省联考2017】组合数问题 题解(矩阵快速幂优化DP)
题目链接 题目大意:求$(\sum\limits_{i=0}^n C_{nk}^{ik+r})\ mod \ p$的值. --------------------- 讲真,一开始看到这个题我都没往DP ...
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
随机推荐
- django 使用 可视化包-Pyechart
Echarts 是百度开源的一个数据可视化 JS 库,主要用于数据可视化.pyecharts 是一个用于生成 Echarts 图表的类库.实际上就是 Echarts 与 Python 的对接. 本次使 ...
- 揭秘Java架构技术体系
Web应用,最常见的研发语言是Java和PHP. 后端服务,最常见的研发语言是Java和C/C++. 大数据,最常见的研发语言是Java和Python. 可以说,Java是现阶段中国互联网公司中,覆盖 ...
- 使用 Java DB (Derby) 数据库
使用 Java DB (Derby) 数据库 https://netbeans.org/kb/docs/ide/java-db_zh_CN.html 本文档说明了如何在 NetBeans IDE 中设 ...
- as3 关闭加载流
/** Loader 取消加载**/ function closeQueueLoader():void { if (cur_loader && cur_loader.contentLo ...
- span width不起作用,border 无效
span属于内联元素,因此width对内联元素不起作用. 需要设置display:inline-block;使其成为内联级块级元素: border不起作用,主要是未设置border-style:sol ...
- 11 并发编程-(线程)-信号量&Event&定时器
1.信号量(本质也是一把锁)Semaphore模块 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行, 信号量同一时间可以有5个任务拿到锁去执行, 如果说互斥锁是合租 ...
- node 的exports 和module
文件05/** * Created by Mr.tiankong on 2017/3/24. */var People = require("./test/people.js"); ...
- 原生js实现三级复选框
工作中要做一个三级的复选框,用js实现了一下,从项目中把相关代码抽取出来了,有相关需求的可以参考一下.亲测可用. <!DOCTYPE html> <html> <head ...
- 推荐的 MongoDB 安装文档
简介: MongoDB 是一个由 C++ 语言编写的基于分布式文件存储的数据库,是目前最像关系型数据库的非关系型数据库. 最近写爬虫, 思来想去觉得还是用 MongoDB 比较方便. 一.安装 # 官 ...
- 将JDBC的resultSet映射到JavaBaen
// 执行赋值后SQL, rs=pstm.executeQuery(); //判断是否有返回结果,有下一行rs.next()方法为true ...