Educational Codeforces Round 60 D dp + 矩阵快速幂
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可以用矩阵快速幂
- 构造矩阵如图:
\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;
}
Educational Codeforces Round 60 D dp + 矩阵快速幂的更多相关文章
- Educational Codeforces Round 14E. Xor-sequences(矩阵快速幂)
传送门 题意 给定序列,从序列中选择k(1≤k≤1e18)个数(可以重复选择),使得得到的排列满足\(x_i与x_{i+1}\)异或的二进制表示中1的个数是3的倍数.问长度为k的满足条件的序列有多少种 ...
- Educational Codeforces Round 52E(构造,快速幂)
#include <bits/stdc++.h>using namespace std;const int mod=998244353;long long b[200007];long l ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) 题解
Educational Codeforces Round 60 (Rated for Div. 2) 题目链接:https://codeforces.com/contest/1117 A. Best ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)
题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...
- Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】
题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- bnuoj 34985 Elegant String DP+矩阵快速幂
题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...
随机推荐
- Codeforces Beta Round #76 (Div. 2 Only)
Codeforces Beta Round #76 (Div. 2 Only) http://codeforces.com/contest/94 A #include<bits/stdc++.h ...
- javascript简单的滑动效果
利用setInterval实现简单的滑动效果 <!DOCTYPE html> <html lang="en"> <head> <meta ...
- windows phpstudy如何扩展MongoDB
phpstudy如何扩展MongoDB 作者: default|标签:phpstudy MongoDB PHP|2017-9-9 10:17 phpstudy扩展MongoDB 前置工作安装PHPst ...
- TZOJ 1911 A Plug for UNIX(最大流)
描述 You are in charge of setting up the press room for the inaugural meeting of the United Nations In ...
- c#: PointToClient与PointToScreen
起因: 很早就见过这两个方法,却未曾深入研究,偶尔一用,却纠结于其转换方法,遂写Demo以求验证,记录认知以做备忘. 其为Control类的内置方法,原型为: // // 摘要: // 将指定屏幕点的 ...
- 使用Nginx做转发和匹配替换
Nginx是一个强大的服务器软件,由于处理数据内容处于第七层协议应用层的原因,所以获取的数据也比较完整: Nginx做转发: 这个很简单,vi nginx.conf(编辑nginx配置文件) 添加lo ...
- @params、@PathVariabl和@RequestParam用法与区别
[1]params params: 指定request中必须包含某些参数值是,才让该方法处理. @RequestMapping(value = "testParamsAndHeaders&q ...
- Linux系统安装过程
一.安装VMware® Workstation 14 Pro,有一些安装时会出现virtual XT的错误,这需要重启电脑进入BIOS,开户虚拟加速开关:有些win8/10会出现虚拟网卡安装失败的情况 ...
- epoll机制:epoll_create、epoll_ctl、epoll_wait、close
在Linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll.相比于select,epoll最大的好处在于它不会随着监听fd数 ...
- android xml解析中的null问题
当我们从服务器或者xml文件加载xml进行解析的时候,往往报告 nullpointer 错误.这是原始代码: String short_name = doc.getElementsByTagName( ...