背景

守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她传送到后面的监狱内查看,她比较懒,一般不查看完所有的监狱,只是从入口进入,然后再从出口出来就算完成任务了。

描述

头脑并不发达的warden最近在思考一个问题,她的闪烁技能是可以升级的,k级的闪烁技能最多可以向前移动k个监狱,一共有n个监狱要视察,她从入口进去,一路上有n个监狱,而且不会往回走,当然她并不用每个监狱都视察,但是她最后一定要到第n个监狱里去,因为监狱的出口在那里,但是她并不一定要到第1个监狱。

守望者warden现在想知道,她在拥有k级闪烁技能时视察n个监狱一共有多少种方案?

格式

输入格式

第一行是闪烁技能的等级k(1<=k<=10)
第二行是监狱的个数n(1<=n<=2^31-1)

输出格式

由于方案个数会很多,所以输出它 mod 7777777后的结果就行了

样例1

样例输入1

2
4

样例输出1

5

限制

各个测试点1s

提示

把监狱编号1 2 3 4,闪烁技能为2级,
一共有5种方案
→1→2→3→4
→2→3→4
→2→4
→1→3→4
→1→2→4

小提示:建议用int64,否则可能会溢出

来源

杜杜我爱你个人原创

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <stdlib.h>
 5 #include <math.h>
 6
 7 using namespace std;
 8 const int maxn=20,mod=7777777;
 9 long long int f[maxn];//存放到第几个监狱时的走法
10
11 struct mat{
12     long long int a[maxn][maxn];
13 }res,ans;
14
15 //matrix multiply j1*j2 n dimension(square)
16 mat cheng1(mat j1,mat j2,int n){
17     mat tmp;
18     for(int i=1;i<=n;i++)
19         for(int j=1;j<=n;j++)
20             tmp.a[i][j]=0;
21     for(int i=1;i<=n;i++)
22         for(int j=1;j<=n;j++)
23             for(int k=1;k<=n;k++)
24                 tmp.a[i][j]=(j1.a[i][k]*j2.a[k][j])%mod+tmp.a[i][j];
25     return tmp;
26 }
27
28
29 //quickpow k dimension n multi_n
30 mat qp(int k,int n){
31     for(int i=1;i<=k;i++)
32         for(int j=1;j<=k;j++){
33             if(i==j)ans.a[i][j]=1;
34             else ans.a[i][j]=0;
35         }
36     while(n){
37         if(n&1)
38             ans=cheng1(res,ans,k);
39         res=cheng1(res,res,k);
40         n>>=1;
41     }
42     return ans;
43 }
44
45 int main()
46 {
47     int k,n;//k级 n个
48     scanf("%d%d",&k,&n);
49     f[0]=1;
50     for(int i=1;i<=k;i++){
51         f[i]=0;
52         for(int j=i-1;j>=0&&j>=i-k;j--){
53             f[i]+=f[j];
54         }
55     }
56     for(int i=1;i<=k-1;i++){
57         res.a[i][i+1]=1;
58         res.a[k][i]=1;
59     }
60     res.a[k][k]=1;
61     res=qp(k,n-k);
62     long long int m[maxn]={0};
63     for(int j=1;j<=k;j++){
64         m[k]+=res.a[k][j]*f[j];
65     }
66     printf("%lld\n",m[k]%mod);
67     return 0;
68 }

View Code

大概是矩阵快速幂优化dp的经典题型,学习了

状态转移方程非常好想,所以一开始天真的我想用滚动数组把它全部循环一遍

然而数据太大了……当然是没法过的

所以要用矩阵乘法来缩短时间,算法了解一下->点这里

然后就是那个mod777...7……这句话我看了很久才明白是啥意思……

不过改完还是wa了几次,40分,原因是我只是在结果那边简单地%了一下mod(这有个毛用啊)

其实中间计算的时候数据就已经溢出了

所以又改了一下矩阵乘法计算过程中的数,因为反正都相当于是减了很多个mod所以对最后结果没有什么影响

转载于:https://www.cnblogs.com/yalphait/p/8650130.html

18.03.26 vijos1067Warcraft III 守望者的烦恼相关推荐

  1. Vijos P1067Warcraft III 守望者的烦恼

    题目 背景 守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫"闪烁",这个技能可以把她传送到后面的监狱内 ...

  2. Warcraft III 守望者的烦恼

    题目描述 头脑并不发达的warden最近在思考一个问题,她的闪烁技能是可以升级的,k级的闪烁技能最多可以向前移动k个监狱,一共有n个监狱要视察,她从入口进去,一路上有n个监狱,而且不会往回走,当然她并 ...

  3. vijos 1067 Warcraft III 守望者的烦恼 矩阵

    题目链接 我们可以很容易的推出dp的式子, dp[i] = sigma(j : 1 to k) dp[i-j]. 但是n太大了, 没有办法直接算, 所以我们构造一个矩阵, 然后快速幂就好了. 就像这样 ...

  4. Linux TUN/TAP 虚拟网卡编程入门https://backreference.org/2010/03/26/tuntap-interface-tutorial/...

    原文: https://backreference.org/2010/03/26/tuntap-interface-tutorial/ (为防和谐,下文中p=屁) Tun/Tap interface ...

  5. matlab 模拟交易,股票量化投资策略模拟交易系统 [2017.03.26 更新]

    本帖最后由 heawjc 于 2017-3-27 17:13 编辑 本系统允许自主研发量化投资策略并进行模拟交易,从2000多只A股中自动选取并交易:策略研发完成即可对历史行情数据进行模拟调试,验证其 ...

  6. http://www.cnblogs.com/Bear-Study-Hard/archive/2008/03/26/1123267.html

    http://www.cnblogs.com/Bear-Study-Hard/archive/2008/03/26/1123267.html 转载于:https://www.cnblogs.com/m ...

  7. 2019.03.26 bzoj4444: [Scoi2015]国旗计划(线段树+倍增)

    传送门 题意简述:现在给你一个长度为mmm的环,有nnn条互不包含的线段,问如果强制选第iii条线段至少需要用几条线段覆盖这个环,注意用来的覆盖的线段应该相交,即[1,3],[4,5][1,3],[4 ...

  8. 18.03.21 继承作业

    A:全面的MyString 描述 程序填空,输出指定结果 #include <cstdlib> #include <iostream> using namespace std; ...

  9. 18.03.28 vijos1071新年趣事之打牌

    描述 过年的时候,大人们最喜欢的活动,就是打牌了.xiaomengxian不会打牌,只好坐在一边看着. 这天,正当一群人打牌打得起劲的时候,突然有人喊道:"这副牌少了几张!"众人一 ...

最新文章

  1. 面向对象模型的四种核心技术
  2. unity中app实现拖拽_10分钟让你实现在APP中对网络状态变化进行全局提示
  3. Gogs-Windows Server下搭建Git服务器
  4. linux管理磁盘和文件系统
  5. 第三章 改进神经网络的学习方式(上)
  6. linux 下安装java
  7. linux 故障注入_基于chaosblade的故障注入平台小试
  8. loginButton.setOnClickListener(this);这里为什么要用this呢?
  9. Hologres揭秘:如何支持超高QPS在线服务(点查)场景
  10. RMI原理揭秘之远程方法调用
  11. ios修改了coredata数据结构后,更新安装会闪退
  12. 7-2 是否完全二叉搜索树 (30分)
  13. 六元均匀直线阵的各元间距为_小间距led显示屏的封装方式有哪些?本文带你了解!...
  14. 你真的了解什么是项目管理吗?
  15. K3CLOUD业务系统编码规则设置
  16. 基于OpenPose的人体姿态检测
  17. win10系统开启扫描仪服务器,win10通用扫描仪安装步骤
  18. 2021 Java面试真题集锦
  19. pip换源 conda换源
  20. Javascript 实现的 CXK 打篮球游戏

热门文章

  1. 免费流量越来越难,付费推广势在必行
  2. HDU 5514 Frogs(欧拉函数+数论YY)
  3. 用python实现合数分解
  4. 关于超宽屏21:9显示器不能调节正确分辨率的解决办法
  5. 计算机启动硬盘自检,硬盘自检怎么关闭-电脑启动时硬盘自检的解决方法 - 河东软件园...
  6. [HeMIM]Cl,[AeMIM]Br,[CeEIM]Cl,([HO-PECH-MIM]Cl,[HOOC-PECH-MIM]Cl改性酚醛树脂
  7. 计算机961考研试题,2008年北京航空航天大学961计算机专业综合考研试题
  8. 固网+G网业务营销方案
  9. Linux32位和64位系统的区别及如何选择?
  10. 基于云服务创建实时运营数据分析服务(三)