Fy's dota2 题解
题目描述
Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水。但 是 fy 一次最多前进 k 的距离,泉水离 fy 现在的距离是 n。 Fy 想知道他到泉水的方案数。
输入输出格式
输入格式:
第一行 2 个整数:k,n
输出格式:
一行 1 个整数:代表答案对 7777777 取膜的结果
数据范围约定
对于 30%的数据:n<=1000,k<=10
对于 100%的数据:1<=n<=2^31-1,1<=k<=10
题解
更具题目我们先来推一下,我们发现当允许的跳跃距离为 k 时,调到 i 新增加的方案数只会从(i-k)~ (i - 1)提供贡献,而其他的方案都可以归类到其中,所以我们就可以得到下面这个递推公式

初始量是f[1] = 1, f[0] = 1;
而由于数据范围是到2^31所以我们要考虑用矩阵乘法来优化递推:

代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long struct Martix
{
LL a[][];
Martix friend operator * (Martix x, Martix y)
{
Martix ans;
memset(ans.a, , sizeof(ans));
for(int i = ; i <= ; ++ i)
for(int j = ; j <= ; ++ j)
for(int k = ; k <= ; ++ k)
ans.a[i][j] = (ans.a[i][j] + (x.a[i][k] * y.a[k][j]) % ) % ;
return ans;
} Martix friend operator % (Martix x, int m)
{
for(int i = ; i<= ; ++ i)
for(int j = ; j <= ; ++ j)
x.a[i][j] = x.a[i][j] % m;
return x;
}
};
int m, n;
LL f[], sum[];
Martix ksm(Martix x, LL b, LL mod)
{
Martix ret;
memset(ret.a, , sizeof(ret.a));
for(int i = ; i <= m; ++ i) ret.a[][i] = f[i];
for(;b; b >>= , x = (x * x) % mod)
if(b & ) ret = (ret * x) % mod;
return ret;
} int main()
{
// freopen("fyfy.in","r",stdin);
// freopen("fyfy.out","w",stdout);
LL ans = ;
Martix zy;
memset(zy.a, , sizeof(zy.a));
scanf("%d%d", &m, &n);
if(n > m)
{
for(int i = ; i <= m; ++ i) zy.a[i][m] = , f[i] = ;
for(int i = ; i <= m; ++ i) zy.a[i][i - ] = ;
for(int i = ; i <= m; ++ i)
for(int j = ; j < i; ++ j)
f[i] = f[i] + f[j];
zy = ksm(zy, n - , );
// for(int i = 1; i <=m; ++ i)
// ans = (ans + ((long long)f[i] * zy.a[i][1]) % 7777777) % 7777777;
printf("%lld\n", zy.a[][]);
}
else
{
for(int i = ; i <= n; ++ i) f[i] = sum[i - ] + , sum[i] = sum[i - ] + f[i];
printf("%lld\n", f[n]);
}
return ;
}
考场上写Wa掉了,可我怎么也没想到是把转移矩阵和初始向量相乘的时候算错了,为了避免这个问题我们可以把初始向量放在快速幂的0次矩阵的第一行,这样就不会错了。
Fy's dota2 题解的更多相关文章
- Fy's dota2
Fy 觉得自己玩 cf,lol 这种高端游戏已经够厉害了,于 是他决定去玩 dota2.结果 fy 的鼠标右键坏了,所以他就等 到 2250 买了把闪烁匕首,用跳刀前进,准备去送泉水.但 是 fy 一 ...
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- PAT 甲级真题题解(1-62)
准备每天刷两题PAT真题.(一句话题解) 1001 A+B Format 模拟输出,注意格式 #include <cstdio> #include <cstring> #in ...
- Connections in Galaxy War (逆向并查集)题解
Connections in Galaxy War In order to strengthen the defense ability, many stars in galaxy allied to ...
- POJ - 题解sol[暂停更新]
初期:一.基本算法: (1)枚举. (poj1753,poj2965) poj1753 话说我用高斯消元过了这题... poj2965 巧了,用高斯消元01矩阵更快(l o l). (2)贪心(poj ...
- HDU1043 Eight(八数码:逆向BFS打表+康托展开)题解
Eight Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- SPOJ LAS(BFS)题解
题目:VJ 思路: BFS+回溯,但是要剪枝,看了dalao的题解,超时+WA无数发,终于过了 #include<cstdio> #include<cstring> #incl ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- 题解【bzoj2733 [HNOI2012]永无乡】
Descriprition 两种操作 把两个集合并起来 求一个集合中的第 \(k\) 大(的编号) \(n \leq 10^5\) Solution 平衡树的板子题之一 维护两个点连不连通直接并查集 ...
随机推荐
- yum lnmp全家桶
######################################################### #by:kingle # #use: lnmp # #version:1.0 # # ...
- 016-hibernateutils模板
package ${enclosing_package}; import org.hibernate.HibernateException; import org.hibernate.Session; ...
- 精简版LINUX系统---wdOS
wdOS是一个基于CentOS版本精简优化过的Linux服务器系统,网站服务器系统并集成nginx,apache,php,mysql等web应用环境及wdcp管理系统,安装完系统,所有的都安装完成装好 ...
- Hashtable(哈希表)
简体字繁体字转化: class Program { static void Main(string[] args) { Hashtable ht = new Hashtable(); ; i < ...
- python学习(七)--豆瓣爬取电影名,评分以及演员
import requestsimport re #爬取豆瓣电影排名pageNum = int(input("要查看第几页电影分数:"))#已知豆瓣默认每页展示20条#url= & ...
- 多线程篇四:ThreadLocal实现线程范围内变量共享
1.static实现线程范围内变量共享 package com.test.shareData; import java.util.Random; /** * 多线程范围内的数据共享 * @author ...
- 解决iframe IE8透明不兼容
要使 ie8 的 iframe 的透明,需要设置两点: 设置 iframe 的 allowTransparency 属性值为 true: <iframe allowtransparency=&q ...
- html5格式样式
<b> 加粗 <b style="font-size: 100px;">大字体</b>
- 图解JavaScript中的原型链
转自:http://www.jianshu.com/p/a81692ad5b5d typeof obj 和 obj instanceof Type 在JavaScript中,我们经常用typeof o ...
- 16_Queue_利用wait()和notify()编写一个阻塞队列
[线程间通信概念] 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体必用方式之一.当线程存在通信指挥,线程间的交互性会更强大,在提高CPU利用率的同 ...