题目描述

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

输入

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

输出

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

样例输入

4 2

样例输出

37


题解

矩阵乘法

设前$i$项的和为$S_i$,那么根据定义有$a_n=S_{n-1}+n^k$,故有$S_n=S_{n-1}+a_n=2S_{n-1}+n^k$。

由于k不大,显然这个式子可以矩乘。

具体方法:维护矩阵$\begin{bmatrix}S_{n-1}&n^k&n^{k-1}&...&n^1&n^0\end{bmatrix}$,那么$S$的转移矩阵就是上面的式子,而$n^i$的转移矩阵就是二项式系数,即$(n+1)^i$的展开式。

于是矩阵乘法加速递推,最终的答案就是$S_n-S_{n-1}$。

时间复杂度$O(k^3\log n)$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define mod 1000000007
using namespace std;
typedef long long ll;
int d;
struct data
{
ll v[12][12];
ll* operator[](int a) {return v[a];}
data() {memset(v , 0 , sizeof(v));}
data operator*(data a)
{
data ans;
int i , j , k;
for(i = 0 ; i <= d + 1 ; i ++ )
for(j = 0 ; j <= d + 1 ; j ++ )
for(k = 0 ; k <= d + 1 ; k ++ )
ans[i][j] = (ans[i][j] + v[i][k] * a[k][j]) % mod;
return ans;
}
}A , P;
data pow(data x , ll y)
{
data ans;
int i;
for(i = 0 ; i <= d + 1 ; i ++ ) ans[i][i] = 1;
while(y)
{
if(y & 1) ans = ans * x;
x = x * x , y >>= 1;
}
return ans;
}
int main()
{
ll n;
int i , j;
scanf("%lld%d" , &n , &d);
for(i = 1 ; i <= d + 1 ; i ++ ) A[0][i] = 1;
P[0][0] = 2 , P[1][0] = 1;
for(i = d + 1 ; i ; i -- )
{
P[d + 1][i] = 1;
for(j = d ; j >= i ; j -- ) P[j][i] = P[j + 1][i + 1] + P[j][i + 1];
}
A = A * pow(P , n - 1);
printf("%lld\n" , ((A * P)[0][0] - A[0][0] + mod) % mod);
return 0;
}

【bzoj5015】[Snoi2017]礼物 矩阵乘法的更多相关文章

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

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

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

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

  3. [bzoj5015][Snoi2017]礼物

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

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

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

  5. SNOI2017 礼物

    题解 设前\(n\)个人的礼物个数和为\(F_n\), 那么显然\[F_n = 2 \times F_{n-1} + i^k\] 考虑矩阵快速幂 棘手的问题是:\(i^k\)不是可以直接用矩阵乘法可以 ...

  6. *HDU2254 矩阵乘法

    奥运 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  7. *HDU 1757 矩阵乘法

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  9. POJ3070 Fibonacci[矩阵乘法]

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13677   Accepted: 9697 Descri ...

随机推荐

  1. 如何将一个div水平垂直居中

    方案一: div绝对定位水平垂直居中[margin:auto实现绝对定位元素的居中], 兼容性:,IE7及之前版本不支持 div{ width: 200px; height: 200px; backg ...

  2. mpvue项目中安装weui

    观察一下发现,mpvue项目打包css的规律是:根组件App.vue里的style样式全部打包到 dist  /  static / css / app.wxss ..   参照微信小程序的原生引入使 ...

  3. 深入浅出:了解jsonp跨域的九种方式

    什么是“”跨域”: 跨域访问,简单来说就是 A 网站的 javascript 代码试图访问 B 网站,包括提交内容和获取内容.由于安全原因,跨域访问是被各大浏览器所默认禁止的.当一个域与其他域建立了信 ...

  4. jQuery、Angluar、Avalon对比

    最近在慕课网看一些关于avalon的视频,记录下一些笔记及代码实例以便日后自己复习可以用到,另外也可以给不想花时间看视频的小伙伴提供一丝丝帮助 这里主要是做一个简单的todolist 分别用三种不同的 ...

  5. springBoot支持PageHelp插件使用学习笔记

    首先在springboot项目的maven中加入依赖(版本可能需要自己选择合适的) <dependency> <groupId>com.github.pagehelper< ...

  6. jsp <form>表单提交中如何在value属性中写表达式

    <input type="text" name="grop_id" value="<%=rs.getString(2)%>" ...

  7. 【转载】谈MongoDB的应用场景

    引用:http://blog.csdn.net/adparking/article/details/38727911 MongoDB的应用场景在网上搜索了下,很少介绍关于传统的信息化应用中如何使用Mo ...

  8. POJ3682 概率DP

    King Arthur's Birthday Celebration Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3575 ...

  9. 4、spring boot 配置文件之profile

    Profile  1.多Profile文件 我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml 默认使用application.prop ...

  10. 3、springboot配置文件占位符

    RandomValuePropertySource:配置文件中可以使用随机数 ${random.value}.${random.int}.${random.long}.${random.int(10) ...