题目链接:Click here

Solution:

设\(f(x)\)代表第\(x\)个人送的礼物的数量,\(s(x)\)代表\(f(x)\)的前缀和,即:

\[f(x)=s(x-1)+x^k\\
s(x)=s(x-1)+f(x)\\
s(x)=2\times s(x-1)+x^k
\]

则我们只需求出\(s(n-1)\)即可,\(n\le1e18\),考虑矩阵快速幂优化\(dp\)

这里唯一麻烦的就是\(x^k\),考虑二项式定理:\((x+1)^k=\sum_{i=0}^k{k\choose i}x^{k-i}\)

则我们得到这样的转移:

\[\left[
\begin{matrix}
2&C_k^0&C_k^1&\dots &C_k^k\\
0&C_k^0&C_k^1&\dots &C_k^k\\
0&0&C_{k-1}^0&\dots &C_{k-1}^{k-1}\\
\vdots&\ddots&\dots& &\vdots\\
0&0&0&\dots&C_0^0
\end{matrix}
\right]
\left[
\begin{matrix}
s(x)\\
x^k\\
x^{(k-1)}\\
\vdots\\
x^0
\end{matrix}
\right]
=
\left[
\begin{matrix}
s(x+1)\\
(x+1)^k\\
(x+1)^{(k-1)}\\
\vdots\\
(x+1)^0
\end{matrix}
\right]
\]

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
int n,k,c[11][11];
struct Matrix{
int g[12][12],w,h;
void init(){memset(g,0,sizeof(g));}
void org(){for(int i=0;i<12;i++)g[i][i]=1;}
friend Matrix operator *(Matrix a,Matrix b){
Matrix tmp;tmp.w=a.w;tmp.h=b.h;tmp.init();
for(int i=0;i<a.w;i++)
for(int j=0;j<b.h;j++)
for(int k=0;k<a.h;k++)
tmp.g[i][j]=(tmp.g[i][j]+(a.g[i][k]*1ll*b.g[k][j])%mod)%mod;
return tmp;
}
};
Matrix qpow(Matrix a,int b){
Matrix re;re.w=re.h=k+2;
re.init();re.org();
while(b){
if(b&1) re=re*a;
b>>=1;a=a*a;
}return re;
}
int pow(int a,int b){
int re=1;
while(b){
if(b&1) re=(re*1ll*a)%mod;
b>>=1;a=(a*1ll*a)%mod;
}return re;
}
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
signed main(){
n=read(),k=read();
for(int i=0;i<=k;i++) c[i][i]=c[i][0]=1;
for(int i=1;i<=k;i++)
for(int j=1;j<i;j++)
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
Matrix trans;trans.w=k+2,trans.h=k+2;
trans.init();trans.g[0][0]=2;
for(int i=1;i<=k+1;i++) trans.g[0][i]=c[k][i-1];
for(int i=1;i<=k+1;i++)
for(int j=i;j<=k+1;j++)
trans.g[i][j]=c[k+1-i][j-i];
if(n==1) return puts("1"),0;
trans=qpow(trans,n-2);
Matrix ans;ans.w=k+2;ans.h=1;ans.init();
for(int i=0;i<=k+2;i++) ans.g[i][0]=1;
ans=trans*ans;printf("%lld\n",(ans.g[0][0]+pow(n%mod,k))%mod);
return 0;
}

「SNOI2017」礼物的更多相关文章

  1. loj2253 「SNOI2017」礼物

    对于一个在位置 \(i\) 的数,他等于 \(i^k+sum_{1,k-1}\). 二项式定理推 \(i^k\),矩阵快速幂即可. #include <iostream> #include ...

  2. AC日记——「HNOI2017」礼物 LiBreOJ 2020

    #2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...

  3. loj #2255. 「SNOI2017」炸弹

    #2255. 「SNOI2017」炸弹 题目描述 在一条直线上有 NNN 个炸弹,每个炸弹的坐标是 XiX_iX​i​​,爆炸半径是 RiR_iR​i​​,当一个炸弹爆炸时,如果另一个炸弹所在位置 X ...

  4. loj #2254. 「SNOI2017」一个简单的询问

    #2254. 「SNOI2017」一个简单的询问 题目描述 给你一个长度为 NNN 的序列 aia_ia​i​​,1≤i≤N1\leq i\leq N1≤i≤N,和 qqq 组询问,每组询问读入 l1 ...

  5. loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点

    loj#2255. 「SNOI2017」炸弹 线段树优化建图,拓扑,缩点 链接 loj 思路 用交错关系建出图来,发现可以直接缩点,拓扑统计. 完了吗,不,瓶颈在于边数太多了,线段树优化建图. 细节 ...

  6. 「SNOI2017」一个简单的询问

    「SNOI2017」一个简单的询问 简单的解法 显然可以差分一下. \[get(l,r,x)\times get(l1,r1,x)=get(1,r,x) \times get(1,r1,x)-get( ...

  7. LOJ——#2256. 「SNOI2017」英雄联盟

    https://loj.ac/problem/2256 题目描述 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强 ...

  8. 「Poetize9」礼物运送

    3055: 礼物运送 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 18  Solved: 12[Submit][Status] Description ...

  9. LOJ2255. 「SNOI2017」炸弹 (线段树)

    本文为线段树做法 (听说可以tarjan缩点+拓扑? 感觉差不多..而且这样看起来方便很多 找到左端点的过程可以看作 点 -> 区间内lowerbound最小的点 -> lowerboun ...

随机推荐

  1. paramiko-ssh-秘钥认证实例

    import paramiko private_key = paramiko.RSAKey.from_private_key_file('id_rsa.txt') #创建ssh对象 ssh =para ...

  2. # 风险定性(Qualitative)分析

    1. 从一个给教师打分的设计表说起 我们参加一个培训课程,一般在培训结束之后,培训机构一般都会分发一份培训师培训效果反馈表,用于评价其讲师的培训能力的强弱. 如果是一家没有什么经验的培训机构设计的反馈 ...

  3. O032、Nova reboot 和 lock 操作

    参考https://www.cnblogs.com/CloudMan6/p/5479408.html   前面通过日志详细分析了 nova 的 launch.shutoff .start 操作.   ...

  4. vue-loading图

    父组件给子组件src地址: columns(){ return [ {'title': '图片', 'key': 'img', render(h, {row}){ return h(LoadingIm ...

  5. 【Git的基本操作三】基本操作命令

    基本操作 (1) 状态查看操作 git status 作用:查看工作区.暂存区状态 (2) 添加操作 git add [filename] 作用:将工作区文件的 添加/修改,添加到暂存区 (3) 提交 ...

  6. 编译原理-递归下降分析法 c程序部分的分析

    实验三 语法分析程序实验 专业 商软2班   姓名 黄仲浩  学号 201506110166 一. 实验目的      编制一个部分文法分析程序. 二. 实验内容和要求 输入:源程序字符串 输出:正确 ...

  7. TCP/IP网络知识

    1.TCP/IP概念 TCP/IP不是单指一种传输协议,而是一组传输控制协议/互联网协议. 2.TCP/IP分层 (计算机网络中,实际应用的网络协议是TCP/IP协议族,TCP/IP的应用层大体上对应 ...

  8. 能当壁纸用的Git常用命令速查表

    使用Microsoft Office 2016手工绘制. 链接: https://pan.baidu.com/s/18KsH-u5T2iSTHaXd6iQWGA 提取码: w8da 复制这段内容后打开 ...

  9. C++虚函数和纯虚函数的用法和区别

    C++虚函数与纯虚函数用法与区别(转)   1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能 ...

  10. DA_06_iptables 与 firewalld 防火墙

    8.1 防火墙管理工具 防火墙作为公网与内网之间的保护屏障,在保障数据的安全性方面起着至关重要的作用.主要功能都是依据策略对穿越防火墙自身的流量进行过滤.防火墙策略可以基于 流量的源目地址.端口号.协 ...