题目背景

“A fight? Count me in!” 要打架了,算我一个。

“Everyone, get in here!” 所有人,都过来!

题目描述

小 Y 是一个喜欢玩游戏的 OIer。一天,她正在玩一款游戏,要打一个 Boss。

虽然这个 Boss 有 10100 点生命值,但它只带了一个随从—---一个只有 m 点生命值的 ‘‘恐怖的奴隶主’’。

这个 ‘‘恐怖的奴隶主’’ 有一个特殊的技能:每当它被扣减生命值但没有死亡(死亡即生命值 ≤ 0),且 Boss 的随从数量小于上限 k,便会召唤一个新的具有 m 点生命值的‘恐怖的奴隶主’’。

现在小 Y 可以进行 n 次攻击,每次攻击时,会从 Boss 以及 Boss 的所有随从中的等概率随机选择一个,并扣减 1 点生命值,她想知道进行 n 次攻击后扣减 Boss 的生命值点数的期望。为了避免精度误差,你的答案需要对 998244353 取模。

输入输出格式

输入格式:

从文件 patron.in 中读入数据。

输入第一行包含三个正整数 T; m; k, T 表示询问组数, m; k 的含义见题目描述。

接下来 T 行,每行包含一个正整数 n,表示询问进行 n 次攻击后扣减 Boss 的生命

值点数的期望。

输出格式:

输出到文件 patron.out 中。

输出共 T 行,对于每个询问输出一行一个非负整数,表示该询问的答案对 998244353取模的结果。

可以证明,所求期望一定是一个有理数,设其为 p/q(gcd(p; q) = 1),那么你输出的数 x 要满足 p ≡ qx (mod 998244353)。

题意:一个boss,初始带了一个小怪兽(满血为m 1->3),你打一下小怪兽(-1)如果它没死并且当前怪兽数不超过上限k(1-9),就会召唤另一个满血的小怪兽,或者你打一下boss对它造成1的伤害,它比较自信,不会再召唤什么奇怪的东东,求n轮(n<=1e18)对怪兽伤害的期望;

题解:

①让我们来观察一下诡异的数据范围:1e18 8 3 ,矩阵幂优化dp吧。。。。

②dp[h,i,j,k] 表示第h轮,血量为1 2 3 的怪兽个数为 i j k 的概率,再打一次伤害期望贡献为$\frac{dp[h,i,j,k]}{i+j+k+1}$,同时转移到其他状态的概率是$\frac{1}{i+j+k+1}$;省去h,把 dp[i,j,k] 重新定义成长度为1*tot的行矩阵,再定义一个tot*tot的矩阵,初始时tot*tot的矩阵可以dp推出,上快速幂

③统计答案,因为打怪兽和打boss是等概率的,比较方便的是再多加一位tot+1,A[tot+1][tot+1] = 1,这样就可以统计每一次的答案,最后输出ans[tot+1]即可;

④比较重要的是复杂度,根据插隔板的原理(详见白书P104)  $tot = \sum_{i=2}^{10}C_{i}^{2} = 165$ $O(tot^{3}log n*T)$。 倍增预处理后面的(tot+1)*(tot+1)的矩阵的2^k把复杂度里的*T换成+T*lg n就好了;

⑤卡常(心累):其它奇技淫巧就不赘述了,主要是在矩阵乘法的时可以先用一个大数lim = k*mod(k∈Z),超了就减去lim,最后再取模(异常缓慢的取模运算)。

 //#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define ll unsigned long long
using namespace std;
const int mod=;
const ll lim=16940360401038606353llu;
int T,m,p,ans[],tot,id[][][],inv[];
ll n;
struct Mat{
ll v[][];
Mat(){memset(v,,sizeof(v));}
ll *operator[](int a){return v[a];}
Mat operator *(const Mat &a){
Mat ret;
for(int i=;i<=tot+;i++)
for(int j=;j<=tot+;j++){
for(int k=;k<=tot+;k++){
ret.v[i][j]+=v[i][k]*a.v[k][j];
if(ret.v[i][j]>=lim) ret.v[i][j]-=lim;
}
ret.v[i][j]%=mod;
}
return ret;
}
}A[];///
char gc(){
static char *p1,*p2,s[];
if(p1==p2) p2=(p1=s)+fread(s,,,stdin);
return(p1==p2)?EOF:*p1++;
}//
ll rd(){
ll x=; char c=gc();
while(c<''||c>'') c=gc();
while(c>=''&&c<='') x=x*+c-'',c=gc();
return x;
}//
void pre(){
inv[]=;for(int i=;i<=p+;i++) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
for(int i=;i<=p;i++)
for(int j=;j<=(m>?p-i:);j++)
for(int k=;k<=(m>?p-i-j:);k++)
id[i][j][k] = ++tot;
for(int i=;i<=p;i++)
for(int j=;j<=(m>?p-i:);j++)
for(int k=;k<=(m>?p-i-j:);k++){
int np=id[i][j][k],nk=(i+j+k<p),ni=inv[i+j+k+];
if(m==) if(i) A[][np][id[i-][j][k]] = 1ll*i*ni%mod;
if(m==) {
if(i) A[][np][id[i-][j][k]] = 1ll*i*ni%mod;
if(j) A[][np][id[i+][j-+nk][k]] = 1ll*j*ni%mod;
}
if(m==) {
if(i) A[][np][id[i-][j][k]] = 1ll*i*ni%mod;
if(j) A[][np][id[i+][j-][k+nk]] = 1ll*j*ni%mod;
if(k) A[][np][id[i][j+][k-+nk]] = 1ll*k*ni%mod;
}
A[][np][np]=A[][np][tot+]=ni;
}
A[][tot+][tot+]=;
for(int i=;i<=;i++) A[i]=A[i-]*A[i-];
}///
void mul(int *ans,Mat M){
ll ret[];
for(int j=;j<=tot+;j++){
ret[j] = ;
for(int k=;k<=tot+;k++) {
ret[j] += ans[k] * M.v[k][j];
if(ret[j]>=lim) ret[j] -=lim;
}
ret[j] %= mod;
}
for(int j=;j<=tot+;j++) ans[j]=ret[j];
}///
int main()
{ freopen("mzoj1121.in","r",stdin);
freopen("mzoj1121.out","w",stdout);
T=rd(); m=rd(); p=rd();
pre();
while(T--){
n=rd();
memset(ans,,sizeof(ans));
if(m==) ans[id[][][]]=;
else if(m==) ans[id[][][]]=;
else ans[id[][][]]=;
for(int i=;i>=;i--) if(n>>i&) mul(ans,A[i]); //
printf("%d\n",ans[tot+]);
}
return ;
}//by tkys_Austin;

【luogu P4007 清华集训2017】小Y和恐怖奴隶主的更多相关文章

  1. [清华集训2017]小 Y 和地铁(神奇思路,搜索,剪枝,树状数组)

    世界上最不缺的就是好题. 首先考虑暴搜.(还有什么题是从这东西推到正解的……) 首先单独一个换乘站明显没用,只用考虑一对对的换乘站. 那么有八种情况:(从题解偷图)         然后大力枚举每个换 ...

  2. 【luogu P4005 清华集训2017】小Y和地铁

    题目描述 小 Y 是一个爱好旅行的 OIer.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁. 她发现每条地铁线路可以看成平面上的一条曲线,不同线路的交点处一定会设有 换乘站 . ...

  3. 【清华集训】小Y和地铁

    图已挂,前往luogu 题目: 小 $\rm Y$ 是一个爱好旅行的 $\rm OIer$.一天,她来到了一个新的城市.由于不熟悉那里的交通系统,她选择了坐地铁.她发现每条地铁线路可以看成平面上的一条 ...

  4. 清华集训2017D2T1 小 Y 和地铁(metro)

    题目:https://www.luogu.org/problem/show?pid=P4005 题意:一条线段,给定n个点(n<=44)其中每个点可能对应另外一个点.如果一个点有对应点,那么就要 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 201621123031 《Java程序设计》第11周学习总结

    作业11-多线程 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 源代码阅读:多线程程序BounceThread ...

  2. 201621123043 《Java程序设计》第7周学习总结

    1. 本周学习总结 2.书面作业 1. GUI中的事件处理 1.1 写出事件处理模型中最重要的几个关键词. 事件:用户的操作. 事件源:产生事件的组件. 事件监听程序:对事件进行处理的操作所引发的相关 ...

  3. 视图和URL配置

    视图和URL配置 实验简介 上一章里我们介绍了如何创建一个Django项目并启动Django的开发服务器.本章你将学到用Django创建动态网页的基本知识. 同时,也教会大家怎么在本地机器上建立一个独 ...

  4. io多路复用(三)

    #!/usr/bin/env python # -*- coding:utf-8 -*- import socket sk1 = socket.socket() sk1.bind(('127.0.0. ...

  5. 深度学习之 mnist 手写数字识别

    深度学习之 mnist 手写数字识别 开始学习深度学习,先来一个手写数字的程序 import numpy as np import os import codecs import torch from ...

  6. Spring中报"Could not resolve placeholder"的解决方案

    除去properites文件路径错误.拼写错误外,出现"Could not resolve placeholder"很有可能是使用了多个PropertyPlaceholderCon ...

  7. ELK学习总结(1-2)安装ElasticSearch

    1.下载安装      Centos6.4      jdk1.8.20以上 elasticsearch::https://www.elastic.co/downloads/elasticsearch ...

  8. BAT美团滴滴java面试大纲(带答案版)之三:多线程Lock

    继续面试大纲系列文章. 这是多线程的第二篇. 多线程就像武学中对的吸星大法,理解透了用好了可以得道成仙,俯瞰芸芸众生:而滥用则会遭其反噬. 在多线程编程中要渡的第二个“劫”,则是Lock.在很多时候, ...

  9. spring6——AOP的编程术语

    面向切面编程作为一种编程思想,允许我们对程序的执行流程及执行结果动态的做出改变,以达到业务逻辑之间的分层管理或者是目标对象方法的增强,spring框架很好的实现了这种编程思想,让我们可以对主业务逻辑和 ...

  10. 模板引擎Jade详解

    有用的符号: | 竖杠后的字符会被原样输出 · 点表示下一级的所有字符都会被原样输出,不再被识别.(就是|的升级版,实现批量) include 表示引用外部文件 短杠说明后面跟着的字符只是一段代码(与 ...