题意:

      给以个递推f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), for n > d.,给你n,d,a1,a2..ad ,f[1],f[2]..f[d],让你求f[n]%m.

思路:

      比较基础的矩阵题目,每次都构造一个d*d的矩阵,然后用快速幂求出来它的n-1次幂,然后在求出乘积就行了,简单构造,没有什么坑点。

          

#include<stdio.h>

#include<string.h>

typedef struct

{

   long long Mat[16][16];

}MAT;

long long n ,MOD ,d;

MAT mm(MAT a ,MAT b)

{

   MAT c;

   memset(c.Mat ,0 ,sizeof(c.Mat));

   for(int i = 1 ;i <= d ;i ++)

   for(int j = 1 ;j <= d ;j ++)

   for(int k = 1 ;k <= d ;k ++)

   c.Mat[i][j] = (c.Mat[i][j] + a.Mat[i][k] * b.Mat[k][j])%MOD;

   return c;

}

MAT Quick(MAT a ,long long b)

{

   MAT c;

   memset(c.Mat ,0 ,sizeof(c.Mat));

   for(int i = 1 ;i <= d ;i ++)

   c.Mat[i][i] = 1;

   while(b)

   {

      if(b&1) c = mm(c ,a);

      a = mm(a ,a);

      b>>=1;

   }

   return c;

}

int main ()

{

   long long D[16] ,F[16] ,i;

   MAT A;

   while(~scanf("%lld %lld %lld" ,&d ,&n ,&MOD) && d + n + MOD)

   {

      for(i = 1 ;i <= d ;i ++) 

      {

         scanf("%lld" ,&D[i]);

         D[i] %= MOD;

      }

      for(i = 1 ;i <= d ;i ++) 

      {

         scanf("%lld" ,&F[i]);

         F[i] %= MOD;

      }

      if(n <= d)

      {

         printf("%lld\n" ,F[n]);

         continue;

      }

      memset(A.Mat ,0 ,sizeof(A.Mat));

      int x = 2 ,y = 1;

      for(i = 2 ;i <= d ;i ++)

      {

         A.Mat[x][y] = 1;

         x ++ ,y ++;

      }

      for(i = 1 ;i <= d ;i ++)

      A.Mat[i][d] = D[d-i+1];

      

      

      A = Quick(A ,n - 1);

      long long Ans = 0;

      for(i = 1 ;i <= d ;i ++)

      {

         Ans += F[i] * A.Mat[i][1];

         Ans %= MOD;

      }

      printf("%lld\n" ,Ans);

   }

   return 0;

}

      

      

      

      

      

      

      

      

   

   

   

   

最新文章

  1. Tomcat中的Session小结
  2. C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
  3. URL 路径长度限制(错误:指定的文件或文件夹名称太长)
  4. MySQL 数据库双向镜像、循环镜像(复制)
  5. Linux收集
  6. Python基础、collections补充
  7. [LeetCode] Simplify Path(可以不用看)
  8. Redbean:入门(四) - 反射机制 以及 事务
  9. Amazon 开始接受 Windows 礼品卡预订
  10. 【转】PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
  11. caffe源码学习之Proto数据格式【1】
  12. 06-Python入门学习-元组、字典、集合类型
  13. 两个对象的 hashCode()或equals相同,equals或hashCode不一定相同--《案例演示》
  14. input 标签,不可更改
  15. [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
  16. 2018牛客暑期ACM多校训练营第二场(有坑未填)
  17. JavaScript基础笔记(九)事件
  18. 以太坊钱包开发系列2 - 账号Keystore文件导入导出
  19. MongoDB索引管理-索引的创建、查看、删除
  20. SoapUI Pro Project Solution Collection-access the soapui object

热门文章

  1. MySQL 表的约束与数据库设计
  2. 关于python浮点数精度问题计算误差的原因分析
  3. Nodejs学习笔记(3) 创建服务器:Web 模块(http)与 express 框架
  4. python中类的魔法方法
  5. 1、Spring教程之Spring概述
  6. Linux基础之Shell与变量
  7. 2048小游戏(c++)(转)
  8. 201871010203-陈鹏昱 实验三 结对项目—《D{0-1}KP 实例数据集算法实验平台》项目报告
  9. 研发效率破局之道 Facebook工作法
  10. Dynamics CRM实体系列之视图