zoukankan      html  css  js  c++  java
  • 10.17T6 矩阵快速幂

    Description

    【题目背景】 
      守望者-warden,长期在暗夜精灵的的首都艾萨琳内担任视察监狱的任务,监狱是成长条行的,守望者warden拥有一个技能名叫“闪烁”,这个技能可以把她传送到后面的监狱内查看,她比较懒,一般不查看完所有的监狱,只是从入口进入,然后再从出口出来就算完成任务了。 
    【问题描述】 
      头脑并不发达的warden最近在思考一个问题,她的闪烁技能是可以升级的,k级的闪烁技能最多可以向前移动k个监狱,一共有n个监狱要视察,她从入口进去,一路上有n个监狱,而且不会往回走,当然她并不用每个监狱都视察,但是她最后一定要到第n个监狱里去,因为监狱的出口在那里,但是她并不一定要到第1个监狱。
      守望者warden现在想知道,她在拥有k级闪烁技能时视察n个监狱一共有多少种方案? 

    Input

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

    Output

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

    Sample Input

    2 4

    Sample Output

    5

    Hint

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

      小提示:建议用long long,否则可能会溢出
     
     
     
     
    明显的矩阵快速幂,不过没有大小,套板子就可以了,现在终于能轻松手写快速幂了
    code:
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 using namespace std;
     5 struct matrix{
     6     long long a[11][11];
     7 };
     8 long long n,m;
     9 const long long mod=7777777;
    10 matrix mul(matrix a,matrix b){
    11     matrix ans;
    12     memset(ans.a,0,sizeof ans.a);
    13     for(long long k=1;k<=n;k++){
    14         for(long long i=1;i<=n;i++){
    15             for(long long j=1;j<=n;j++){
    16                 ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
    17             }
    18         }
    19     }
    20     return ans;
    21 }
    22 int main(){
    23     cin>>n>>m;
    24     matrix base;
    25     memset(base.a,0,sizeof base.a);
    26     for(long long i=1;i<=n;i++)base.a[i][1]=1;
    27     for(long long i=1;i<n;i++)base.a[i][i+1]=1;
    28     matrix ans;
    29     memset(ans.a,0,sizeof ans.a);
    30     for(long long i=1;i<=n;i++)ans.a[i][i]=1;
    31     for(;m;m>>=1){
    32         if(m&1){
    33             ans=mul(ans,base);
    34         }
    35         base=mul(base,base);
    36     }        
    37     cout<<ans.a[1][1];
    38     return 0;
    39 }

    over

  • 相关阅读:
    oracle+st_geometry
    php开发面试题---php面向对象详解(对象的主要三个特性)
    php开发面试题---Mysql常用命令行大全
    php开发面试题---Linux常用命令大全
    php开发面试题---vue面试题(vue.js的好处及作用)
    php开发面试题---数据库SQL调优的几种方式
    剑指offer---2、二叉搜索树的后序遍历序列
    MYSQL中IN与EXISTS的区别
    mysql笔试题大餐---2、exists加一些查询
    正确理解MySQL中的where和having的区别
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9807168.html
Copyright © 2011-2022 走看看