SNOI2017 礼物
题解
设前\(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\)取模
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
using namespace std;
typedef long long LL;
const LL mod = 1e9 + 7;
LL power(LL a, LL n, LL mod)
{
LL Ans = 1;
while (n)
{
if (n & 1) Ans = Ans * a % mod;
a = a * a % mod;
n >>= 1;
}
return Ans;
}
LL n; int K;
struct Matrix
{
LL a[12][12];
Matrix() { memset(a, 0, sizeof(a)); }
LL* operator [] (int x) { return a[x]; }
friend Matrix operator * (Matrix a, Matrix b)
{
Matrix Ans;
for (int i = 0; i <= K + 1; i++)
for (int k = 0; k <= K + 1; k++)
if (a[i][k])
for (int j = 0; j <= K + 1; j++)
(Ans[i][j] += a[i][k] * b[k][j] % mod) %= mod;
return Ans;
}
};
Matrix power(Matrix a, LL n)
{
Matrix Ans;
for (int i = 0; i <= K + 1; i++) Ans[i][i] = 1;
while (n)
{
if (n & 1) Ans = Ans * a;
a = a * a;
n >>= 1;
}
return Ans;
}
Matrix Ans, a;
int main()
{
Matrix A, Ans;
scanf("%lld %d", &n, &K);
if (n <= 2)
{
LL Ans = 1;
for (int i = 2; i < n; i++)
Ans = (2 * Ans + power(i, K, mod)) % mod;
Ans = (Ans + power(n, K, mod)) % mod;
printf("%lld\n", Ans);
return 0;
}
A[0][0] = 1;
for (int i = 1; i <= K; i++)
{
A[i][0] = 1; A[i][i] = 1;
for (int j = 1; j < i; j++)
A[i][j] = (A[i-1][j-1] + A[i-1][j]) % mod;
}
A[K+1][K+1] = 2;
for (int i = 0; i <= K; i++)
A[K+1][i] = A[K][i];
for (int i = 0; i <= K; i++)
Ans[i][1] = 1;
Ans[K+1][1] = 1;
Ans = power(A, n - 2) * Ans;
printf("%lld\n", (Ans[K+1][1] + power(n%mod, K, mod)) % mod);
return 0;
}
SNOI2017 礼物的更多相关文章
- BZOJ_5015_[Snoi2017]礼物_矩阵乘法
BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...
- bzoj 5015 [Snoi2017]礼物 矩阵乘法
5015: [Snoi2017]礼物 Time Limit: 15 Sec Memory Limit: 512 MBSubmit: 163 Solved: 115[Submit][Status][ ...
- 洛谷P5364 [SNOI2017]礼物 题解
传送门 /* 热情好客的小猴子请森林中的朋友们吃饭,他的朋友被编号为 1∼N,每个到来的朋友都会带给他一些礼物:大香蕉.其中,第一个朋友会带给他 11 个大香蕉,之后,每一个朋友到来以后,都会带给他之 ...
- [bzoj5015][Snoi2017]礼物
来自FallDream的博客,未经允许,请勿转载,谢谢. 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋 ...
- 【bzoj5015】[Snoi2017]礼物 矩阵乘法
题目描述 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第一个朋友会带给他 1 个,之后,每一个朋友到来以后,都会带给他之前所有人带来的礼物个数再 ...
- bzoj5015 [Snoi2017]礼物 矩阵快速幂+二项式展开
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5015 题解 设 \(f_i\) 表示第 \(i\) 个朋友的礼物,\(s_i\) 表示从 \( ...
- bzoj 5015 [Snoi2017]礼物
题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5015 题解 首先把k=1,k=2,k=3的手推一遍 然后发现一些规律 就是数列可以表示成$a ...
- 「SNOI2017」礼物
题目链接:Click here Solution: 设\(f(x)\)代表第\(x\)个人送的礼物的数量,\(s(x)\)代表\(f(x)\)的前缀和,即: \[ f(x)=s(x-1)+x^k\\ ...
- loj2253 「SNOI2017」礼物
对于一个在位置 \(i\) 的数,他等于 \(i^k+sum_{1,k-1}\). 二项式定理推 \(i^k\),矩阵快速幂即可. #include <iostream> #include ...
随机推荐
- 回望2017,基于深度学习的NLP研究大盘点
回望2017,基于深度学习的NLP研究大盘点 雷锋网 百家号01-0110:31 雷锋网 AI 科技评论按:本文是一篇发布于 tryolabs 的文章,作者 Javier Couto 针对 2017 ...
- 解决ios和Android的差异
第一个:input,button input标签在 android系统不带圆角,在ios系统上带圆角 解决办法: input,button{ -webkit-appearance:none; } 第二 ...
- IBM Security App Scan Standard 工具的使用
1.AppScan是什么? AppScan是IBM的一款web安全扫描工具,可以利用爬虫技术进行网站安全渗透测试,根据网站入口自动对网页链接进行安全扫描,扫描之后会提供扫描报告和修复建议等. AppS ...
- java开发客户端发送请求到服务器端出现这样:JSON parse error: Unexpected character ('}' (code 125)): was expecting
org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected cha ...
- js中parseInt()与parseFloat(),Number(),Boolean(),String()转换
js将字符串转数值的方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把 ...
- Ultra.Base
winform 基础类库 https://github.com/ZixiangBoy/Ultra.Base
- Vue路由注意事项
一.vue中路由的使用 1.定义组件 <template> <div class="hello"> <h1 @click="info&quo ...
- URIs, URLs, and URNs
首先,URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体 ...
- SpringBoot内嵌数据库的使用(H2)
配置数据源(DataSource) Java的javax.sql.DataSource接口提供了一个标准的使用数据库连接的方法. 传统做法是, 一个DataSource使用一个URL以及相应的证书去构 ...
- C++ 中赋值运算符重载以及深拷贝浅拷贝解析
转载自:http://blog.csdn.net/business122/article/details/21242857 关键词:构造函数,浅拷贝,深拷贝,堆栈(stack),堆heap,赋值运算符 ...