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 ...
随机推荐
- <foreach></foreach>标签
当传入参数为数组或者集合时需要通过<foreach></foreach>标签进行遍历 1.首先在po类中定义一个集合或者数组 比如 private List<Intege ...
- Laravel 在homestead 平台上命令
使用以下命令查看 Heroku 站点地址: $ heroku domains
- original和source的区别
最近跟网页翻译怼上了,在给翻译前的页面起名是纠结于使用original page还是source page,就查了一下original和source的区别. original: n. 原件:原作:原物 ...
- SpringMVC学习01——HelloSpringMvc Demo
HelloWorldController.java文件 package com.su.controller; import org.springframework.stereotype.Control ...
- [Udemy] ES 7 and Elastic Stack - part 3
Section 7: Analyzing Log Data with the Elastic Stack
- Idea maven远程调试(pom配置tomcat)
服务器端,maven内置tomcat启动命令:mvnDebug clean tomcat7:run -Dmaven.test.skip=true 服务器端:配置(vim或者文件模式打开mvnDebug ...
- python2.7打印中文乱码的问题解决
一. import sys reload(sys) sys.setdefaultencoding('utf-8') print('测试中文') 二. print(‘我是中国人’) >>&g ...
- SpringBoot 使用maven创建springboot项目
有两种方式可以创建 1是使用spring-boot-starter-parent ,2是使用spring-boot-dependencies (即父项目dependencyManagement) ( ...
- [19/05/08-星期三] JDBC(Java DataBase Connectivity)_ORM(Object Relationship Mapping, 对象关系映射)
一.概念 基本思想: – 表结构跟类对应: 表中字段和类的属性对应:表中记录和对象对应: – 让javabean的属性名和类型尽量和数据库保持一致! – 一条记录对应一个对象.将这些查询到的对象放到容 ...
- Sentinel之熔断降级
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一.由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积.Sentinel 熔断降级会在调用链路 ...