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 ...
随机推荐
- kubernetes-helm程序包管理器(二十)
helm概述 Helm是Kubernetes的包管理器,Helm 让我们能够像 yum 管理 rpm 包那样安装.部署.升级和删除容器化应用. Helm的核心术语: Chart:一个helm程序包,是 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_2_对象的序列化流_ObjectOutputStream
创建person对象.生成构造方法全参和无参.getter和setter 抛出异常:没有序列化异常 接口的源码 啥都没有.就起到一个标记的作用 用二进制存的
- 测开之路九十八:js变量和语句
这里为了方便调试,在jsbin网站上面编写js脚本:https://jsbin.com/?js,console 可以点击增加/减少对应展示分页,Console为控制台部分,Output为页面部分 变量 ...
- 每日js练习
第一次玩codewars,选了个最简单的题目 要求是: You have to write a function that describe Leo: if oscar was (integer) 8 ...
- Git-第五篇廖雪峰Git教程学习笔记(4)分支
1.一开始,只有一个主分支(master),HEAD指向Master,而Master指向主分支.现在我们创建dev分支. lfy@lfy-PC MINGW64 /c/fyliu/lfyTemp/git ...
- C++ 14 新特性总结
转载自: http://www.codeceo.com/article/cpp-14-new-features.html C++14 这一继C++11 之后的新的 C++ 标准已经被正式批准,正在向 ...
- 2.golang应用目录结构和GOPATH概念
golang 语言有一个GOPATH的概念就是当前工作目录 [root@localhost golang_test]# tree . ├── bin │ └── hello ├── first.g ...
- HDU-1269 迷宫城堡(连通分量)
迷宫城堡 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 4014 Jimmy’s travel plan(图计数)
Jimmy’s travel plan Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- k3 cloud中获取年月日
日期类型字段元素.Date.Year(获取年) 日期类型字段元素.Date.Month(获取月)日期类型字段元素.Date.Day(获取天)