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的更多相关文章

  1. Fy's dota2 题解

    题目描述 Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水.但 是 ...

  2. Dota2 demo手游项目历程

    最近其实是打算认真研究c++ primer和设计模式的原著,然后写一些读书笔记的,不过设计模式原著里生词太多,大多都看的不是很明白,因此暂时放弃阅读设计模式,打算用这些时间做一个类似我叫mt2的手游d ...

  3. Win8&Win2012R2如何支持DOTA2输入法

    微软自带的拼音和五笔就不用看了,没研究过,下面的方法应该不支持. 其实方法很简单运行下ctfmon.exe就可以了,这个原来旧输入模式的基础,测试可以支持QQ五笔. PS:使用拼音输入法的用户可以直接 ...

  4. Linux下玩转Dota2

    Dota2是一款颇为风靡的即时战略类游戏,去年官方就支持Mac和Linux了,对于习惯Mac和linux平台的孩子们来说,简直感动的泪流满面. 当然,也简直是linux程序猿的福音啊啊! 与Win8. ...

  5. [LeetCode] Dota2 Senate 刀塔二参议院

    In the world of Dota2, there are two parties: the Radiant and the Dire. The Dota2 senate consists of ...

  6. [Swift]LeetCode649. Dota2 参议院 | Dota2 Senate

    In the world of Dota2, there are two parties: the Radiantand the Dire. The Dota2 senate consists of ...

  7. 使用scrapy爬取dota2贴吧数据并进行分析

    一直好奇贴吧里的小伙伴们在过去的时间里说的最多的词是什么,那我们就来抓取分析一下贴吧发文的标题内容,并提取分析一下,看看吧友们在说些什么. 首先我们使用scrapy对所有贴吧文章的标题进行抓取 scr ...

  8. 【转】 DOTA2中的伪随机及其lua实现

    因为单纯的随机确实会影响到竞技性,所以dota2引入的是伪随机机制,在大量的技能中,比如说混沌的混乱之箭.剑圣的剑舞.冰女的冰霜领域之类的技能,都利用了伪随机机制. 而纯随机,或者标准正态分布并不会因 ...

  9. 基于SpringBoot+SSM实现的Dota2资料库智能管理平台

    Dota2资料库智能管理平台的设计与实现 摘    要 当今社会,游戏产业蓬勃发展,如PC端的绝地求生.坦克世界.英雄联盟,再到移动端的王者荣耀.荒野行动的火爆.都离不开科学的游戏管理系统,游戏管理系 ...

随机推荐

  1. Scrapy 组件的具体用法

    一.Spider 用法 在 Scrapy 中,要抓取网站的链接配置.抓取逻辑.解析逻辑都是在 Spider 里完成的.Spider 的一些基础属性和基础方法: name:爬虫名字,Spider的名字定 ...

  2. HTML5 实现Link跳线效果

    之前我们推出过Flex版本的Link跳线效果,现在基于HTML5新版本的跳线效果也实现了,细微之处我们进行了改进,如link倾斜的时候Offset方向始终保持垂直等.先看效果.实现的算法和Flex基本 ...

  3. 题解 [USACO18DEC]Balance Beam

    被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...

  4. Semi-colon expected (eclipse 引入 json文件报错)

    最近做的项目用到的前端框架有一个json文件夹,里面全是json文件,所以导入Eclipse的时候会在整个项目上都是红叉,但是其实不影响项目运行的,之前忙着码代码也没时间管他,这个红叉存留了一个月!今 ...

  5. linux diff-比较给定的两个文件的不同

    推荐:更多Linux 文件查找和比较 命令关注:linux命令大全 diff命令在最简单的情况下,比较给定的两个文件的不同.如果使用“-”代替“文件”参数,则要比较的内容将来自标准输入.diff命令是 ...

  6. response对象设置输出缓冲大小

    response对象设置输出缓冲大小 制作人:全心全意 通常情况下,服务器要输出到客户端的内容不会直接写到客户端,而是先写到一个输出缓冲区,在计算机术语中,缓冲区被定义为暂时放置输入或输出资料的内存. ...

  7. pandas文本处理

    import pandas as pd import numpy as np s = pd.Series([', np.nan, 'hj']) df = pd.DataFrame({'key1': l ...

  8. NumPy 学习笔记(四)

    NumPy 算术函数: 1.numpy.reciprocal(arr) 返回参数逐个元素的倒数 2.numpy.power(one, two) 将第一个输入数组中的元素作为底数,计算它与第二个输入数组 ...

  9. Remmarguts’ Date(poj 2449)

    求第k短路的长度,如果没有,输出-1. /* k短路模板 注意当s=t时,k++. */ #include<iostream> #include<cstdio> #includ ...

  10. 选择数字(codevs 3327)

    题目描述 Description 给定一行n个非负整数a[1]..a[n].现在你可以选择其中若干个数,但不能有超过k个连续的数字被选择.你的任务是使得选出的数字的和最大. 输入描述 Input De ...