Fy's dota2
Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于
是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等
到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水。但
是 fy 一次最多前进 k 的距离,泉水离 fy 现在的距离是 n。
Fy 想知道他到泉水的方案数。
输入格式:
第一行 2 个整数:k,n
输出格式:
一行 1 个整数:代表答案对 7777777 取膜的结果
样例输入:
2 4
样例输出
5
样例解释
一共有 5 种方案
→1→2→3→4
→2→3→4
→2→4
→1→3→4
→1→2→4
数据范围
对于 30%的数据:n<=1000,k<=10
对于 100%的数据:1<=n<=2^31-1,1<=k<=10
【题解】
递推:Ans[i]表示到i位置的方案数,Ans[i]+=Ans[j] ( j < i &&j>=i-k&&j>=1)
再用矩阵快速幂优化下一维的递推。有点类似于斐波那契数列、上台阶等经典。(然而考试时我不记得矩乘怎么弄了。。。)
矩阵乘法
矩阵就是一个二维数组,只有m*p的矩阵A可以和p*n的矩阵B相乘,交换律不可用。
相乘结果为一个m*n的矩阵C,第i列第j行的元素等于A中第i列(p个元素)和B中第j列(p个元素)对应相乘的积之和。
用矩阵乘法,一般这样:
用S表示状态矩阵,T表示转移矩阵,S*T=S’,就是下一状态矩阵。
我们需要根据S和S’,自行构造T转移矩阵。
以此题cell为例:
我们假设第b天的细胞数为a,那个下一个状态就是:第b+1天的细胞数为ax+b+1
我们把a,b填入S,ax+b,b+1填入S’,有
S(a,b)*T( )=S’(ax+b+1,b+1)
但这样的话1这个常数项构造不出来,所以我们加一项:
S(a,b,1)*T( )=S’(ax+b+1,b+1,1)
用我们的聪明才智构造T:
x,0,0
S(a,b,1)*T 1,1,0 =S’(ax+b+1,b+1,1)
1,1,1
我们要计算是n天后的细胞数,S初始化为(0,0,1),意思是第0天有0个细胞
答案就在S*T^n中,那么因为矩阵乘法满足结合律,所以我们可以对T^n进行快速幂。
或者也可以写成
x,0,0
S(a,b,1)*T 1,1,0 =S’(ax+b,b+1,1) 然后初始化(0,1,1),意思是第1天操作前有0个细胞
0,1,1
这样表示的是第b天进行操作(放入细胞、细胞分裂)之前有细胞个数a。
上代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod=7777777;
int n,k;
struct matrix
{
int a[15][15];
matrix()
{
memset(a,0,sizeof(a));
}
int *operator [](int x)
{
return a[x];
}
matrix operator *(matrix &b)
{
matrix ans;
for (int i=0;i<k;i++)
for (int j=0;j<k;j++)
for (int l=0;l<k;l++)
ans[i][l]=(ans[i][l]+1ll*a[i][j]*b[j][l])%mod;
return ans;
}
}S,T;
void init()
{
for (int i=0;i<k-1;i++) T[i+1][i]=1;
for (int i=0;i<k;i++) T[i][k-1]=1;
}
int main()
{
freopen("fyfy.in","r",stdin);
freopen("fyfy.out","w",stdout);
scanf("%d %d",&k,&n);
S[0][0]=1;
for (int i=1;i<k;i++)
for (int j=0;j<i;j++)
S[0][i]+=S[0][j];
if (n<k)
{
printf("%d",S[0][n]);
return 0;
}
n-=k-1;
init();
while (n)
{
if (n&1) S=S*T;
T=T*T;
n>>=1;
}
printf("%d\n",S[0][k-1]);
return 0;
}
Fy's dota2的更多相关文章
- Fy's dota2 题解
题目描述 Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水.但 是 ...
- Dota2 demo手游项目历程
最近其实是打算认真研究c++ primer和设计模式的原著,然后写一些读书笔记的,不过设计模式原著里生词太多,大多都看的不是很明白,因此暂时放弃阅读设计模式,打算用这些时间做一个类似我叫mt2的手游d ...
- Win8&Win2012R2如何支持DOTA2输入法
微软自带的拼音和五笔就不用看了,没研究过,下面的方法应该不支持. 其实方法很简单运行下ctfmon.exe就可以了,这个原来旧输入模式的基础,测试可以支持QQ五笔. PS:使用拼音输入法的用户可以直接 ...
- Linux下玩转Dota2
Dota2是一款颇为风靡的即时战略类游戏,去年官方就支持Mac和Linux了,对于习惯Mac和linux平台的孩子们来说,简直感动的泪流满面. 当然,也简直是linux程序猿的福音啊啊! 与Win8. ...
- [LeetCode] Dota2 Senate 刀塔二参议院
In the world of Dota2, there are two parties: the Radiant and the Dire. The Dota2 senate consists of ...
- [Swift]LeetCode649. Dota2 参议院 | Dota2 Senate
In the world of Dota2, there are two parties: the Radiantand the Dire. The Dota2 senate consists of ...
- 使用scrapy爬取dota2贴吧数据并进行分析
一直好奇贴吧里的小伙伴们在过去的时间里说的最多的词是什么,那我们就来抓取分析一下贴吧发文的标题内容,并提取分析一下,看看吧友们在说些什么. 首先我们使用scrapy对所有贴吧文章的标题进行抓取 scr ...
- 【转】 DOTA2中的伪随机及其lua实现
因为单纯的随机确实会影响到竞技性,所以dota2引入的是伪随机机制,在大量的技能中,比如说混沌的混乱之箭.剑圣的剑舞.冰女的冰霜领域之类的技能,都利用了伪随机机制. 而纯随机,或者标准正态分布并不会因 ...
- 基于SpringBoot+SSM实现的Dota2资料库智能管理平台
Dota2资料库智能管理平台的设计与实现 摘 要 当今社会,游戏产业蓬勃发展,如PC端的绝地求生.坦克世界.英雄联盟,再到移动端的王者荣耀.荒野行动的火爆.都离不开科学的游戏管理系统,游戏管理系 ...
随机推荐
- 第一节:EasyUI样式,行内编辑,基础知识
一丶常用属性 $('#j_dg_left').datagrid({ url: '/Stu_Areas/Stu/GradeList', fit: true, // 自动适应父容器大小 singleSel ...
- JAVA基础——链表结构之单链表
链表:一种数据存储结构.学链表首先要搞懂数组,按朋友的话说,数组和链表的关系就相当于QQ2008和QQ2009. 除非要通过索引频繁访问各个数据,不然大多数情况下都可以用链表代替数组. 链表部分主要要 ...
- LeetCode15——3Sum
数组中找三个数和为0的结果集 1 // 解法一:先排序 然后固定一个值 然后用求两个数的和的方式 public static List<List<Integer>> three ...
- 动态 SQL(2)
前面我们学习了使用动态 SQL 的 if.where.trim元素来处理一些简单查询操作,但对于一些 SQL 语句中含有 in 条件,需要迭代条件集合来生成的情况,我们就需要使用 foreach 标签 ...
- Servlet监听器的使用
Servlet监听器的使用 制作人:全心全意 在Servlet技术中已经定义了一些事件,并且可以针对这些事件来编写相关的事件监听器,从而对事件做出相应的处理.例如,想要在Web应用程序启动和关闭时来执 ...
- [bzoj1820][JSOI2010][Express Service 快递服务] (动态规划)
Description 「飞奔」快递公司成立之后,已经分别与市内许多中小企业公司签订邮件收送服务契约.由于有些公司是在同一栋大楼内,所以「飞奔」公司收件的地点(收件点)最多只有m点 (1, 2, …, ...
- Android layer-list(1)
Android layer-list(1) Android layer-list,顾名思义,实现列表组合后形成的图层,写一个例子. activity_main.xml文件: <?xml v ...
- mongodb片健的选取及更改
1.总的原则:选键的时候多考虑以下问题. 写操作是怎么样的,有多大? 系统每小时会写多少数据,每天呢,高峰期呢 那些字段是随机的,那些是增长的 读操作是怎么样的,用户在访问那些数据 数据索引做了吗?应 ...
- Ubuntu中LightDM是什么(转)
LightDM(Light Display Manager)是一个全新的轻量级Linux桌面显示管理器,而传统的Ubuntu是使用GNOME桌面标准的GDM. LightDM是一个跨桌面显示管理器,其 ...
- Ubuntu 16.04安装FTP客户端filezilla
1.安装: sudo apt-get install filezilla 参考: http://os.51cto.com/art/201103/247564.htm