LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)
哇这题剧毒,卡了好久常数才过T_T
设$f(i,s)$为到第$i$轮攻击,怪物状态为$s$时对boss的期望伤害,$sum$为状态$s$所表示的怪物个数,得到朴素的DP方程$f(i,s)=\sum \frac{1}{sum+1}*(f(i+1,s')+[s==s'])$
状态数只有$C_{8+3}^3=165$个,所以就可以矩乘优化了。再加上一个用于转移的$1$,矩阵大小是$166*166$的,因为多组询问,所以可以先把$2$的所有次幂的矩阵都预处理出来。
然后会发现复杂度是$O(T*166^3*N)$的,无法承受...
其实答案矩阵只有一列...用它从左往右乘就能把矩阵乘法优化到$O(166^2)$了,总时间复杂度$O(166^3*logn+T*166^2*logn)$。
$16$亿过$2$秒,长见识了...
- #include<iostream>
- #include<cstring>
- #include<cstdlib>
- #include<cstdio>
- #include<cmath>
- #include<algorithm>
- #define ll long long
- using namespace std;
- const int maxn=, mod=;
- const ll inf=;
- struct mtx{int mp[maxn][maxn], n, m;mtx(){memset(mp, , sizeof(mp)); n=m=;}}
- base[];
- mtx operator * (mtx a, mtx b)
- {
- mtx c; c.n=a.n; c.m=b.m;
- for(int i=;i<=a.n;i++)
- for(int j=;j<=b.m;j++)
- {
- ll s=;
- for(int k=;k<=a.m;k++)
- s+=1ll*a.mp[i][k]*b.mp[k][j], s>inf && (s%=mod);
- c.mp[i][j]=s%mod;
- }
- return c;
- }
- int T, m, K, tott;
- ll n;
- int st[maxn], mi[maxn], pos[<<];
- inline int power(int a, int b)
- {
- int ans=;
- for(;b;b>>=, a=1ll*a*a%mod)
- if(b&) ans=1ll*ans*a%mod;
- return ans;
- }
- int main()
- {
- scanf("%d%d%d", &T, &m, &K);
- mi[]=; for(int i=;i<=m;i++) mi[i]=mi[i-]*(K+);
- for(int i=;i<mi[m];i++)
- {
- int sum=;
- for(int j=;j<m;j++) sum+=i/mi[j]%(K+);
- if(sum<=K) st[tott]=i, pos[i]=tott++;
- }
- base[].mp[tott][tott]=;
- base[].n=base[].m=tott;
- for(int i=;i<tott;i++)
- {
- int sum=;
- for(int j=;j<m;j++) sum+=st[i]/mi[j]%(K+);
- int inv=power(sum+, mod-);
- base[].mp[i][tott]=base[].mp[i][i]=inv;
- for(int j=;j<m;j++)
- if(st[i]/mi[j]%(K+))
- {
- int x=st[i]-mi[j];
- if(j) x+=mi[j-];
- if(j && sum<K) x+=mi[m-];
- base[].mp[i][pos[x]]=1ll*inv*(st[i]/mi[j]%(K+))%mod;
- }
- }
- for(int i=;i<;i++) base[i]=base[i-]*base[i-];
- while(T--)
- {
- scanf("%lld", &n); mtx ans; ans.n=tott; ans.mp[tott][]=;
- int digit=; for(;n;n>>=, digit++) if(n&) ans=base[digit]*ans;
- printf("%d\n", ans.mp[pos[mi[m-]]][]);
- }
- }
LibreOJ #2325. 「清华集训 2017」小Y和恐怖的奴隶主(矩阵快速幂优化DP)的更多相关文章
- loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主
#2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较 题目描述 "A fight? Co ...
- 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法
题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...
- LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】
LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...
- LOJ2325「清华集训 2017」小Y和恐怖的奴隶主
题目链接 首先dp很显然,\(f(i,s)\)表示到了第i轮,各种血量人数的情况为s今后的期望攻击boss次数.那么有\(f(i,s)=\frac{1}{num+1}*\sum_{s->s'}( ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- [LOJ#2324]「清华集训 2017」小Y和二叉树
[LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...
- [LOJ#2323]「清华集训 2017」小Y和地铁
[LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...
- 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)
[UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...
- LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】
LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...
随机推荐
- excel的宏与VBA入门(三)——流程控制
一.条件控制IF if 逻辑表达式 then 语句块 end if 带else的if语句: If 逻辑表达式1 Then 语句块1 ElseIf 逻辑表达式2 Then 语句块2 ElseIf 逻辑表 ...
- 20155204 王昊《网络对抗技术》EXP4
20155204 王昊<网络对抗技术>EXP4 一.实验后回答问题 (1)如果在工作中怀疑一台主机上有恶意代码,但只是猜想,所有想监控下系统一天天的到底在干些什么.请设计下你想监控的操作有 ...
- Compensating-Transaction模式
在应用中,会将一系列相关的操作定义为一个连续的操作,当其中一个或者多个步骤失败的时候,Compensating-Transaction模式会重置(回滚)这个连续的操作.在云应用中,这些需要保证一致性的 ...
- ScreenToGif 代码分析
ScreenToGif项目由四个文件夹组成: Files 存放协议文件 GifRecorder 存放gif编码器代码 ScreenToGif 存放主代码 Other 存放Hooktest和Transl ...
- 【DDD】领域驱动设计实践 —— 业务建模战术
本文结合团队在COMMUNITY(社区服务系统)业务建模过程中的实践经验,总结得到一些DDD业务建模的小招数,不一定是完美的,但是对我们团队来说很有效用,希望能帮到其他人.后面会陆续将项目中业务建模的 ...
- Css_button样式对不齐
发现了是按钮的vertical-align式样,统一显示的设置为middle,搞定.
- 阿里云rds 备份和还原
阿里云rds 备份和还原 转发:https://www.cnblogs.com/lin1/p/8617764.html 转发:https://help.aliyun.com/knowledge_det ...
- python基础篇----基本数据类型
bit #bit_length 当前数字的二进制,只用用n位来表示a = 123b = a.bit_length()print(b)#==>7
- 日本厚劳省对IT技术人员展开确保海外人才调查
新浪美股讯 5月13日消息,共同社报道,日本厚生劳动省将开始对在国内工作的外国籍系统工程师(SE)及程序员的劳动条件进行实际状况调查.为避免在与海外的人才获取竞争中败北,希望掌握接纳企业的需求等推动企 ...
- PAT甲题题解-1023. Have Fun with Numbers (20)-大数加法
和1024一样都是大数据的题,因为位数最多要20位,long long最多19位给一个num,求sum=num+num问sum包含的数字,是否是num的一个排列,即数字都一样,只是顺序不同罢了. #i ...