BZOJ_5015_[Snoi2017]礼物_矩阵乘法

Description

热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1~N,每个到来的朋友都会带给他一些礼物:。其中,第
一个朋友会带给他 1 个,之后,每一个朋友到来以后,都会带给他之前所有人带来的礼物个数再加他的编号的 K 
次方那么多个。所以,假设 K=2,前几位朋友带来的礼物个数分别是:1,5,15,37,83假设 K=3,前几位朋友带来的
礼物个数分别是:1,9,37,111现在,好奇自己到底能收到第 N 个朋友多少礼物,因此拜托于你了。已知 N,K请输
出第 N 个朋友送的礼物个数 mod1000000007。

Input

第一行,两个整数 N,K
N≤10^18,K≤10

Output

一个整数,表示第 N 个朋友送的礼物个数 mod1000000007。 

Sample Input

4 2

Sample Output

37

设序列的前缀和为$S_n$,$S_n=S_{n-1}+n^{k}$。
$(S_{n-1}\; n^{k}\; ...n^{0})$ -> $(S_{n}\;(n+1)^{k}\;...(n+1)^{0})$
转移矩阵发现可以用二项式定理。
 
代码:
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long ll;
  6. int m;
  7. ll n,mod=1000000007,c[15][15];
  8. struct Mat {
  9. ll v[14][14];
  10. Mat(){memset(v,0,sizeof(v));}
  11. Mat operator*(const Mat &x)const {
  12. Mat re;int i,j,k;
  13. for(i=1;i<=m;i++) {
  14. for(j=1;j<=m;j++) {
  15. for(k=1;k<=m;k++) {
  16. (re.v[i][j]+=v[i][k]*x.v[k][j]%mod)%=mod;
  17. }
  18. }
  19. }
  20. return re;
  21. }
  22. };
  23. void print(Mat x) {
  24. int i,j;
  25. for(i=1;i<=m;i++) {
  26. for(j=1;j<=m;j++) {
  27. printf("%lld ",x.v[i][j]);
  28. }
  29. puts("");
  30. }
  31. }
  32. Mat qp(Mat x,ll y) {
  33. Mat I;
  34. int i;
  35. for(i=1;i<=m;i++) I.v[i][i]=1;
  36. while(y) {
  37. if(y&1ll) I=I*x;
  38. x=x*x;
  39. y>>=1ll;
  40. }
  41. return I;
  42. }
  43. Mat build() {
  44. Mat x;
  45. int i,j;
  46. x.v[1][1]=2; x.v[2][1]=1;
  47. for(i=2;i<=m;i++) {
  48. int k=m-i+1;
  49. for(j=0;j<=k;j++) {
  50. x.v[j+i][i]=c[k-1][j];
  51. }
  52. }
  53. /*for(i=1;i<=m;i++) {
  54. for(j=1;j<=m;j++) {
  55. printf("%lld ",x.v[i][j]);
  56. }
  57. puts("");
  58. }*/
  59. return x;
  60. }
  61. void init() {
  62. int i,j;
  63. for(i=0;i<=m;i++) c[i][0]=c[i][i]=1;
  64. for(i=1;i<=m;i++) {
  65. for(j=1;j<=m;j++) {
  66. c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod;
  67. }
  68. }
  69. }
  70. int main() {
  71. scanf("%lld%d",&n,&m); m+=2;
  72. init();
  73. Mat A;
  74. int i;
  75. for(i=2;i<=m;i++) A.v[1][i]=1;
  76. Mat x=build();
  77. Mat T=A*qp(x,n-1);
  78. //print(T);
  79. printf("%lld\n",((T*x).v[1][1]-T.v[1][1]+mod)%mod);
  80. }

BZOJ_5015_[Snoi2017]礼物_矩阵乘法的更多相关文章

  1. B20J_1297_[SCOI2009]迷路_矩阵乘法

    B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...

  2. BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法

    BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...

  3. BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法

    BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ ...

  4. BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法

    BZOJ_4002_[JLOI2015]有意义的字符串_矩阵乘法 Description B 君有两个好朋友,他们叫宁宁和冉冉.有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求 Input 一行 ...

  5. BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法

    BZOJ_1712_[Usaco2007 China]Summing Sums 加密_矩阵乘法 Description     那N只可爱的奶牛刚刚学习了有关密码的许多算法,终于,她们创造出了属于奶牛 ...

  6. BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法

    BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...

  7. BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法

    BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...

  8. [LuoguP2151][SDOI2009]HH去散步_递推_矩阵乘法_图论

    HH去散步 题目链接:https://www.luogu.org/problem/P2151 数据范围:略. 题解: 数据范围好小,让人不禁想用一些毒瘤算法,但是失败了. 这种类似时间啊这种有点重复味 ...

  9. [蓝桥杯]ALGO-86.算法训练_矩阵乘法

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

随机推荐

  1. java面试题之分析(二)

    QUESTION NO:2 package com.cdu.test;  public class Test { static boolean foo(char c) { System.out.pri ...

  2. access窗体主体居中

    Private Sub Form_Load()DoCmd.Echo False Dim x, y As IntegerDoCmd.Maximizex = Me.WindowWidthy = Me.Wi ...

  3. 关闭ipv6的方法

    公司研发反应,几台机器开了一些端口,但是访问一直不通. 检查后发现,发现服务开启的是ipv6的端口,所有首先想到的办法就是关闭ipv6. 关闭ipv6的方法有两种: 第一个是在内核配置文件修改配置(p ...

  4. pydev 下Django 1.7 undefined variables from import问题的解决

    参考:http://stackoverflow.com/questions/24951029/pydev-django-undefined-variables-from-import 参考上面的帖子认 ...

  5. ElasticSearch Index 速度优化 (官方翻译)

    使用Bulk请求进行Index Bulk请求将产生比单文档index请求有更好的性能.至于Bulk请求中文档数量的大小,建议使用单一节点单一分片进行测试,先试试看100个,然后200个,然后400这样 ...

  6. java8完全解读二

    继续着上次的java完全解读一 继续着上次的java完全解读一1.强大的Stream API1.1什么是Stream1.2 Stream操作的三大步骤1.2.1 创建Stream1.2.2 Strea ...

  7. LocalDB + IIS

    Win7 + IIS7 1. 安装 (1)LocalDB SQL Express 2012 选中:ENU\x64\SqlLocalDB.MSI (2).net4.5 .net4.5 然后,再配置IIS ...

  8. C#高级编程笔记之第三章:对象和类型

    类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...

  9. oracle 触发器,当一个表更新或插入时将数据同步至另个库中的某个表中

    有两个表分别是 A用户下的 T_SRC_WEATHER_TSPG字段如图, B用户下的t_src_weather 表,如图: 要求,当A用户下的T_SRC_WEATHER_TSPG表有插入或者更新数据 ...

  10. 使用WSL连接Docker for Windows

    在Windows下安装Docker for Windows Cotana搜索功能,打开Windows的Hype-v功能(注:会影响Virtualbox和Vmware的使用)并重启电脑. 从Docker ...