题解

设前\(n\)个人的礼物个数和为\(F_n\), 那么显然$$F_n = 2 \times F_{n-1} + i^k$$

考虑矩阵快速幂

棘手的问题是:\(i^k\)不是可以直接用矩阵乘法可以递推的东西

由二项式定理可得:$$a^k = \sum_{i = 1}{k}(a-1)i {k \choose i}$$

那么我们可以给\(\left[ (i-1)^0\; (i-1)^1\;(i-1)^2\; \cdots\; (i-1)^k\;\right]\) 乘上一个杨辉三角矩阵, 就能得到\(\left[i^0\;i^1\;i^2\;\cdots\;i^k\right]\)

然后我们就能用矩阵快速幂算\(F\), 显然\(Ans = F_{n-1} + i^k\)

于是就做完了

注意:这题两个n相乘可能会long long溢出, 因此算\(n^k\)前要先给\(n\)取模

代码

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long LL;
  8. const LL mod = 1e9 + 7;
  9. LL power(LL a, LL n, LL mod)
  10. {
  11. LL Ans = 1;
  12. while (n)
  13. {
  14. if (n & 1) Ans = Ans * a % mod;
  15. a = a * a % mod;
  16. n >>= 1;
  17. }
  18. return Ans;
  19. }
  20. LL n; int K;
  21. struct Matrix
  22. {
  23. LL a[12][12];
  24. Matrix() { memset(a, 0, sizeof(a)); }
  25. LL* operator [] (int x) { return a[x]; }
  26. friend Matrix operator * (Matrix a, Matrix b)
  27. {
  28. Matrix Ans;
  29. for (int i = 0; i <= K + 1; i++)
  30. for (int k = 0; k <= K + 1; k++)
  31. if (a[i][k])
  32. for (int j = 0; j <= K + 1; j++)
  33. (Ans[i][j] += a[i][k] * b[k][j] % mod) %= mod;
  34. return Ans;
  35. }
  36. };
  37. Matrix power(Matrix a, LL n)
  38. {
  39. Matrix Ans;
  40. for (int i = 0; i <= K + 1; i++) Ans[i][i] = 1;
  41. while (n)
  42. {
  43. if (n & 1) Ans = Ans * a;
  44. a = a * a;
  45. n >>= 1;
  46. }
  47. return Ans;
  48. }
  49. Matrix Ans, a;
  50. int main()
  51. {
  52. Matrix A, Ans;
  53. scanf("%lld %d", &n, &K);
  54. if (n <= 2)
  55. {
  56. LL Ans = 1;
  57. for (int i = 2; i < n; i++)
  58. Ans = (2 * Ans + power(i, K, mod)) % mod;
  59. Ans = (Ans + power(n, K, mod)) % mod;
  60. printf("%lld\n", Ans);
  61. return 0;
  62. }
  63. A[0][0] = 1;
  64. for (int i = 1; i <= K; i++)
  65. {
  66. A[i][0] = 1; A[i][i] = 1;
  67. for (int j = 1; j < i; j++)
  68. A[i][j] = (A[i-1][j-1] + A[i-1][j]) % mod;
  69. }
  70. A[K+1][K+1] = 2;
  71. for (int i = 0; i <= K; i++)
  72. A[K+1][i] = A[K][i];
  73. for (int i = 0; i <= K; i++)
  74. Ans[i][1] = 1;
  75. Ans[K+1][1] = 1;
  76. Ans = power(A, n - 2) * Ans;
  77. printf("%lld\n", (Ans[K+1][1] + power(n%mod, K, mod)) % mod);
  78. return 0;
  79. }

SNOI2017 礼物的更多相关文章

  1. BZOJ_5015_[Snoi2017]礼物_矩阵乘法

    BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...

  2. bzoj 5015 [Snoi2017]礼物 矩阵乘法

    5015: [Snoi2017]礼物 Time Limit: 15 Sec  Memory Limit: 512 MBSubmit: 163  Solved: 115[Submit][Status][ ...

  3. 洛谷P5364 [SNOI2017]礼物 题解

    传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...

  4. [bzoj5015][Snoi2017]礼物

    来自FallDream的博客,未经允许,请勿转载,谢谢. 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋 ...

  5. 【bzoj5015】[Snoi2017]礼物 矩阵乘法

    题目描述 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋友到来以后,都会带给他之前所有人带来的礼物个数再 ...

  6. bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...

  7. bzoj 5015 [Snoi2017]礼物

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5015 题解 首先把k=1,k=2,k=3的手推一遍 然后发现一些规律 就是数列可以表示成$a ...

  8. 「SNOI2017」礼物

    题目链接:Click here Solution: 设\(f(x)\)代表第\(x\)个人送的礼物的数量,\(s(x)\)代表\(f(x)\)的前缀和,即: \[ f(x)=s(x-1)+x^k\\ ...

  9. loj2253 「SNOI2017」礼物

    对于一个在位置 \(i\) 的数,他等于 \(i^k+sum_{1,k-1}\). 二项式定理推 \(i^k\),矩阵快速幂即可. #include <iostream> #include ...

随机推荐

  1. .Net Core入门与.Net需要注意的地方

    1.编码注册 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); 否则抛出异常 'GB2312' is not a suppo ...

  2. daemon(守护、服务员)-t1.setDaemon(true) - 设置为守护线程

    daemon(守护.服务员)t1.setDaemon(true) - 设置为守护线程 class KTV extends Thread{ public void run(){ try { Thread ...

  3. vue 的sync用法

    这个关键字在v2.3.0+ 新增,注意带有 .sync 修饰符的 v-bind 不能和表达式一起使用 (例如 v-bind:title.sync=”doc.title + ‘!’” 是无效的).说白了 ...

  4. 用Vue来实现音乐播放器(十五):处理得到的歌手数据

    之前得到的歌手数据是用forEach遍历添加的  没有顺序性  我们希望得到的数据是title:"热门"的数据在最上面  title为字母的数据按字母从低到高顺序排列 var ho ...

  5. PLSQL设置数据库选项

    1.将数据库安装目录下的"NETWORK"文件夹复制到client(客户端)安装目录下 : 2.修改"NETWORK"-->"ADMIN&quo ...

  6. delphi SetWindowPos改变窗体位置和状态

    http://blog.163.com/yuanliaofan@126/blog/static/1730690722012534428814/ delphi SetWindowPos改变窗体位置和状态 ...

  7. APlayer 媒体播放引擎

    APlayer媒体播放引擎 Windows平台的播放内核 封闭式 DirectShow 架构,不受系统解码环境干扰 全媒体文件格式支持 丰富的媒体文件传输协议(http/https/ftp/mms/r ...

  8. Http Handler 介绍

    引言 在 Part.1 Http请求处理流程 一文中,我们了解了Http请求的处理过程以及其它一些运作原理.我们知道Http管道中有两个可用接口,一个是IHttpHandler,一个是IHttpMod ...

  9. 【ABAP系列】SAP ABAP解析XML的示例程序

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP解析XML的示例 ...

  10. 简单DP入门(一) 数字三角形

    数字三角形