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 ...
随机推荐
- customizable route planning 工业界地图产品的路径规划
https://www.microsoft.com/en-us/research/publication/customizable-route-planning/?from=http%3A%2F%2F ...
- linux设置开机启动程序?
/etc/rc.d/init.d 是 /etc/init.d的目标链接. 如果/etc/rc.d下面没有 rc.local脚本文件, 则需要 手动创建: 而 /etc/bashrc 是在登陆bash ...
- Binder的Native实现libbinder
libbinder – Binder的Native实现 出于性能和代码统一性的角度考虑,Binder IPC并不Java和Native环境里各实现一次,而只是分别在不同的执行环境里提供使用的接口.使用 ...
- 信息收集【采集点OWASP CHINA】网址http://www.owasp.org.cn/
以下部分源于 安全家 http://www.anquanjia.net.cn/newsinfo/729480.html 资源虽多,优质却少.不要被信息海迷惑的心智,新人要想入门,除了优质的系统教学资源 ...
- java Iterator Iterable Collection AbstractCollection Map关系
java.lang Interface Iterable<T> 实现该接口就可以使用for-each循环. java.util Interface Iterator<E> ...
- Vue 基础 day05 webpack 3.x
什么是webpack webpack 是前端的一个项目构建工具, 它是基于 Node.js 开发出来的一个前端工具 借助于webpack这个前端自动化构建工具, 可以完美实现资源的合并.打包.压缩.混 ...
- IDEA Maven project: 'xxx/pom.xml' already exists in VFS
Failed to create a Maven project: 'xxx/pom.xml' already exists in VFS idea创建项目后,发现项目有问题,删除后重新创建,提示错误 ...
- Error querying database. Cause: org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'ItemsCustom' in 'class com.pojo.OrderDetailCustom
再用 junit 测试MyBatis时发现的错误: org.apache.ibatis.exceptions.PersistenceException: ### Error querying data ...
- Java数据结构之稀疏数组(Sparse Array)
1.需求 编写的五子棋程序中,有存盘退出和续上盘的功能.因为该二维数组的很多值是默认值0,因此记录了很多没有意义的数据,为了压缩存储所以采用稀疏数组. 2.基本介绍 当一个数组中大部分元素为0,或者为 ...
- 【洛谷p2239】螺旋矩阵
关于题前废话: 这道题的数据范围过于强大了qwq,显然如果我们开一个30000*30000的二维数组来模拟,显然首先就开不下这么大的数组,然后暴力搜索的话也会爆掉,所以直接模拟显然是一个不正确的选择( ...