https://codeforces.com/contest/1117/problem/D

题意

有n个特殊宝石(n<=1e18),每个特殊宝石可以分解成m个普通宝石(m<=100),问组成n颗宝石有多少种方法

题解

  • 数据很大:找规律or矩阵快速幂
  • 转移方程: dp[i]=dp[i-1]+dp[i-m]
  • 因为n<=1e18可以用矩阵快速幂
  • 构造矩阵如图:

\[\left[
\begin{matrix}
f[i-1] & f[i-2] & \cdots & f[i-m] \\
\end{matrix}
\right]
*
\left[
\begin{matrix}
1 & 1 &0 & \cdots & 0 \\
0 & 0 &1 & \cdots & 0 \\
\vdots & \vdots &\vdots &\ddots & \vdots \\
0 & 0 &0 &\cdots & 1 \\
1 & 0 &0 &\cdots & 0 \\
\end{matrix}
\right]
=
\left[
\begin{matrix}
f[i] & f[i-1] & \cdots & f[i-m+1] \\
\end{matrix}
\right]
\]

代码(矩阵快速幂板子)

#include<bits/stdc++.h>
#define P 1000000007
#define ll long long
#define M 105
using namespace std;
struct N{
ll a[M][M];
};
ll m,n,i,j;
N mul(N x,N y){
N z;
memset(z.a,0,sizeof(z.a));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++){
z.a[i][j]+=x.a[i][k]*y.a[k][j]%P;
z.a[i][j]%=P;
}
return z;
}
N pw(N bs,ll x){
N y;
memset(y.a,0,sizeof(y.a));
for(int i=1;i<=n;i++)y.a[i][i]=1;
while(x){
if(x&1)y=mul(y,bs);
bs=mul(bs,bs);
x>>=1;
}
return y;
}
int main(){
cin>>m>>n;
N f;memset(f.a,0,sizeof(f.a));
f.a[1][1]=1;f.a[n][1]=1;
for(i=1,j=2;j<=n;j++,i++)f.a[i][j]=1;
f=pw(f,m);
cout<<f.a[1][1]%P;
}

最新文章

  1. MFC 修改各种控件的背景颜色、字颜色和字体
  2. 设置button键隐藏文字text
  3. servletcontext监听器的启动位置以及tomcat和eclipse的目录结构
  4. winrt获取文件MD5码
  5. html5 摇一摇事件监听
  6. Altium Designer 画"差分线"
  7. jenkins配置记录(2)--代码发布流程
  8. Google地图
  9. JAVA文件名命名规范
  10. HttpHelper万能框架V1.6
  11. linux下删除文件及文件夹命令
  12. 将本地项目或代码上传到别人GitHub(码云)的远程分支上
  13. 编程菜鸟的日记-初学尝试编程-C++ Primer Plus 第6章编程练习5
  14. git 创建新项目 本地仓库和远程仓库的合并
  15. JavaScript进度条(datalist/repeater等多个进度条)
  16. FORWARD转发链的功能
  17. Get请求,Post请求乱码问题解决方案
  18. [硬件]SICK LMS111激光扫描仪使用
  19. Zabbix 3.0 LTS安装配置
  20. 混合欧拉回路的判断(Dinic)

热门文章

  1. Codeforces Beta Round #29 (Div. 2, Codeforces format)
  2. js阻止时间冒泡事件——event.stopPropagation()
  3. Unicode编码字符范围和具体文字
  4. Object转为Bigdecimal
  5. Socket(转自 阿里云)
  6. oracle学习之数据库数据保存成文件
  7. SQL truncate 、delete与drop区别[z]
  8. python 网络下载的三种风格 未完成
  9. js全局作用域
  10. PHP swoole process的使用