CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E.飞行棋(期望dp+矩阵快速幂)
题目
飞行棋的规则如下:
1、每名玩家有一个棋子,每个回合可以掷一次骰子。
2、如果使用的骰子为 k面,则这 k面上的点数分别为 1,2,3,…,k,且掷得每种点数的概率均为。
3、如果当前回合掷得的点数为 Q,则玩家控制的棋子前进 Q 步。
4、若当前棋子的位置到终点的距离 d < Q,则棋子先行动 d 步到终点,再倒退 Q-d 步。(即到终点的距离变为 Q−d)
5、某一回合结束后,若该玩家的棋子恰好到达终点,则宣布胜利。
璇璇姐姐参与了这个游戏,已知现在她的棋子到终点的距离为 d,
游戏使用的骰子有 k面,求璇璇获得胜利需要的回合数期望。
保证 1<=k<=20,1<=d<=1e18,且k<=d。
思路来源
fls
题解
考虑距离终点k步及以内的情形,dp[i]代表从i这个点,走到终点的期望数
那么dp[1],掷到一步获胜,掷到两步回到1的位置,掷到三步到2的位置,掷到k步去k-1的位置
有,其中dp[0]=0
类似地有,
可以列出所有方程,
可以发现,由于右边每项括号里都有k-1项非零值,高度对称,
所以可以构造一组全相等的解,代入x有x=k
后面的仍用搞矩阵快速幂即可
学到了把k+1阶向量也搞成(k+1)*1的矩阵技巧,
这样最后求第n项时,再搞一个矩阵乘法即可
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e9+7;
const ll MOD = 1e9+7;
const int MAXN = 22;
ll d,k,inv,ans;
ll modpow(ll x,ll n,ll mod)
{ll res=1;for(;n;n/=2,x=x*x%mod)if(n&1)res=res*x%mod;return res;
}
struct mat {ll c[MAXN][MAXN];int m, n;mat(){memset(c, 0, sizeof(c));m=n=MAXN;} mat(int a, int b) : m(a), n(b) {memset(c, 0, sizeof(c));}void clear(){memset(c, 0, sizeof(c)); }mat operator * (const mat& temp) {mat ans(m, temp.n);for (int i = 0; i < m; i ++)for (int j = 0; j < temp.n; j ++){for (int k = 0; k < n; k ++){ans.c[i][j] += c[i][k] * temp.c[k][j]%MOD;//能不取模 尽量不取模//这里maxn=2 故不会超过ll 视具体情况 改变取模情况if(ans.c[i][j]>=MOD)ans.c[i][j]%=MOD;}}return ans;}friend mat operator ^(mat M, ll n) {mat ans(M.m, M.m);for (int i = 0; i < M.m; i ++)ans.c[i][i] = 1; while (n > 0) {if (n & 1) ans = ans * M;M = M * M;n >>= 1;}return ans;}
};
int main()
{scanf("%lld%lld",&d,&k);mat a(k+1,k+1),b(k+1,1); inv=modpow(k,mod-2,mod);for(int i=0;i<k;++i)a.c[0][i]=inv;a.c[0][k]=1;for(int i=1;i<k;++i)a.c[i][i-1]=1;a.c[k][k]=1;a=a^(d-k);for(int i=0;i<k;++i)b.c[i][0]=k;b.c[k][0]=1;a=a*b;printf("%lld\n",a.c[0][0]);return 0;
}
CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E.飞行棋(期望dp+矩阵快速幂)相关推荐
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)比赛总结
CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)比赛总结 总结: 这场比赛不太顺心,B,I水题 10分钟内A了.A题推公式用double写卡了1个小时,换成其他暴力 ...
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)
感觉自己代码能力好弱啊 T1 完全k叉树 传送门 Solution 首先特判一下K=1K=1K=1 然后处理出最大满KKK叉树,设这棵树的深度为rankrankrank,根节点的深度为000,这个时候 ...
- Comet OJ CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)
Preface 在一个月黑风高的夜晚我这个蒟蒻正踌躇着打什么比赛好 是继续做一场AGC,还是去刷一场CF 然后,一道金光闪过(滑稽),我们的红太阳bzt给我指明了方向: 你太菜了,我知道有一场很水的比 ...
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)E
题面 这个题暴好啊,考了很多东西. 首先设f(x)为离终点还有x步要走的期望步数,我们可以发现 : 1.x>=k时,x可以转移到的点的下标都<x. 2.x<k时,则可能走回到x或者下 ...
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019) 飞行棋
https://www.cometoj.com/contest/59/problem/E?problem_id=2714 思路:高斯消元求dp[1]~dp[k-1];然后利用递推式矩阵快速幂求出dp[ ...
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)部分题解
茶颜悦色 题意 固定kkk的矩形,能最多框住多少个点. 题解 假如我们固定一个矩形,以左下角为坐标. 这样子对于(a,b)(a,b)(a,b),那么能够包括到这个点的矩形左下角的范围: x∈(a−k, ...
- CCPC-Wannafly Comet OJ 夏季欢乐赛(2019)A——完全k叉树
题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球"的篮球协会,更奇特的是--让人耳目一新的攀树协 ...
- A 完全k叉树(CCPC-Wannafly Comet OJ 夏季欢乐赛(2019))
题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球"的篮球协会,更奇特的是--让人耳目一新的攀树协 ...
- 完全k叉树(CCPC-Wannafly Comet OJ 夏季欢乐赛(2019) A)
题目描述 欢迎报考JWJU!这里有丰富的社团活动,比如为梦想奋斗的ACM集训队,经常组织飞行棋的桌游协会,喜欢"唱,跳,rap,篮球"的篮球协会,更奇特的是--让人耳目一新的攀树协 ...
最新文章
- view5.3登录桌面提示当前可用桌面资源不足
- 【热点】黑客入侵的常用手段及防护措施分析
- 超励志!从中专生到教授,他32岁成为国家杰青!
- RabbitMQ和Kafka的显著差异(3)
- tcp拥塞控制_面试必备TCP(四):拥塞控制
- 大容量NoSql解决方案:Aerospike实战
- sql 如何设置行级锁_如何使用SQL Server 2016行级安全性过滤和阻止数据访问
- hidefocus小技巧
- sqlite字符串连接(追加写入)
- python英文参考文献格式_英文论文参考文献标准格式
- 调用阿里云语音识别接口
- 笔记:Python Data Science Toolbox (Part 1)
- DAY01.使用JAVA从国家统计局爬取2020年全国统计用区划代码和城乡划分代码(省市区数据)
- 用java输入学生姓名查询成绩_java实现学生成绩录入系统
- 整理的几种适用于GROMACS输入的小分子拓扑文件获取流程
- win11 删除系统自带输入法
- C语言中输出26个字母
- div+css静态网页设计 电商购物网站设计(55页) 电商网页设计制作 简单静态HTML网页作品 购物网页作业成品 学生商城网站模板
- win11不兼容很多游戏?win11不兼容哪些游戏
- 清华版五年级计算机下册教案,清华大学出版社小学五年级信息技术教案新版
热门文章
- 入耳式监控系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- Verilog实现---IEEE标准的单精度浮点乘法器
- 疑难杂症:同网段ping不通,跨网段建不了链,怎么破?
- 不用任何软件,批量转化图片格式png转jpg,bat脚本实现
- Codeforces Round #777 (Div. 2) ABCD题解
- 个人支付宝/微信/云闪付收款技术总览
- 浅议实时操作系统RTOS
- FireFox插件 - Greasemonkey
- 互联网时代颠覆的传统行业
- cod12正版链接在线服务器6,cod6盗版服务器管理命令(Cod6 pirated server management commands).doc...