哇这题剧毒,卡了好久常数才过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)的更多相关文章

  1. loj #2325. 「清华集训 2017」小Y和恐怖的奴隶主

    #2325. 「清华集训 2017」小Y和恐怖的奴隶主 内存限制:256 MiB时间限制:2000 ms标准输入输出 题目类型:传统评测方式:文本比较   题目描述 "A fight? Co ...

  2. 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法

    题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...

  3. LOJ2325. 「清华集训 2017」小 Y 和恐怖的奴隶主【矩阵快速幂优化DP】【倍增优化】

    LINK 思路 首先是考虑怎么设计dp的状态 发现奴隶主的顺序没有影响,只有生命和个数有影响,所以就可以把每个生命值的奴隶主有多少压缩成状态就可以了 然后发现无论是什么时候一个状态到另一个状态的转移都 ...

  4. LOJ2325「清华集训 2017」小Y和恐怖的奴隶主

    题目链接 首先dp很显然,\(f(i,s)\)表示到了第i轮,各种血量人数的情况为s今后的期望攻击boss次数.那么有\(f(i,s)=\frac{1}{num+1}*\sum_{s->s'}( ...

  5. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  6. [LOJ#2324]「清华集训 2017」小Y和二叉树

    [LOJ#2324]「清华集训 2017」小Y和二叉树 试题描述 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙 ...

  7. [LOJ#2323]「清华集训 2017」小Y和地铁

    [LOJ#2323]「清华集训 2017」小Y和地铁 试题描述 小Y是一个爱好旅行的OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的 ...

  8. 【UOJ#340】【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划)

    [UOJ#340][清华集训2017]小 Y 和恐怖的奴隶主(矩阵快速幂,动态规划) 题面 UOJ 洛谷 题解 考虑如何暴力\(dp\). 设\(f[i][a][b][c]\)表示当前到了第\(i\) ...

  9. LOJ2324. 「清华集训 2017」小 Y 和二叉树【贪心】【DP】【思维】【好】

    LINK 思路 首先贪新的思路是处理出以一个节点为根所有儿子的子树中中序遍历起始节点最小是多少 然后这个可以两次dfs来DP处理 然后就试图确定中序遍历的第一个节点 一定是siz<=2的编号最小 ...

随机推荐

  1. android获取内置和外置SD卡路径 - z

    本文将介绍Android真机环境下如何获取内置和外置SD卡路径. 测试环境:三星Note3,其他手机待测试... 所需权限(AndroidManifest.xml文件里) <uses-permi ...

  2. 20155305《网络对抗》PC平台逆向破解(二)

    20155305<网络对抗>PC平台逆向破解(二) shellcode注入 1.shellcode shellcode是一段代码,溢出后,执行这段代码能开启系统shell. 2.构造方法 ...

  3. 20155308『网络对抗技术』Exp7:网络欺诈防范

    20155308『网络对抗技术』Exp7:网络欺诈防范 原理与实践说明 1.实践目标 本实践的目标是:理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 2.实践内容概述 简单应用SET ...

  4. MFC Timer定时器

    知识点: 定时器Timer 创建定时器 销毁定时器 代码测试 一. 创建定时器 UINT SetTimer( HWND hWnd, // 指定关联定时器的窗口句柄,在MFC版将省略此参数 UINT n ...

  5. 解决 引入本地jar包后 maven无法编译的问题及部署war包缺失本地jar包的问题

    参考:https://blog.csdn.net/wang864676212/article/details/82626922 pom.xml 引入 <plugin> <plugin ...

  6. grunt源码解析:整体运行机制&grunt-cli源码解析

    前端的童鞋对grunt应该不陌生,前面也陆陆续续的写了几篇grunt入门的文章.本篇文章会更进一步,对grunt的源码进行分析.文章大体内容内容如下: grunt整体设计概览 grunt-cli源码分 ...

  7. 带WIFI模块布局布线要点。

    带WIFI模块布局布线要求: 1: RF底部不能铺铜要挖空不能有GND否则RF信号会被耦合掉从而无法发送出去. 2:WIFI模块下方不能打孔尽量不走线不打孔避开其他信号穿过下方,要整体的铺铜 3:连接 ...

  8. 212. Space Replacement【LintCode by java】

    Description Write a method to replace all spaces in a string with %20. The string is given in a char ...

  9. Linux 第五周 实验: 分析system_call中断处理过程

    姬梦馨 原创博客 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 使用gdb跟踪分析一个系统调用内核函数 ...

  10. WC----命令行实现对文件信息的统计

    需求分析: 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c ...