[递推+矩阵快速幂]Codeforces 1117D - Magic Gems
传送门:Educational Codeforces Round 60 – D
题意:
给定N,M(n <1e18,m <= 100)
一个magic gem可以分裂成M个普通的gem,现在需要N个gem,可以选择一定的magic gem,指定每一个分裂或不分裂,问一共有多少种方案
两种分裂方案不同当且仅当magic gem的数量不同,或者分裂的magic gem的索引不同。
思路:
1.首先从dp的角度出发
设F(i)为最终需要i个gem的方案数,容易得到递推式:
(总方案数 = 最右边的magic gem分裂得到的方案数 + 最右边的magic gem不分裂得到的方案数)
2.观察数据范围可以看到,如果直接这样计算,时间复杂度是要上天的
我们可以把递推式求解转化成矩阵乘法求解
3.套用矩阵快速幂的板子,加速计算
参考代码:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
#define _____ ios::sync_with_stdio(false);cin.tie(0);
const int M = 1e9 + ;
//head ll n,m;
struct Mat{
ll a[][];
};
Mat mul(const Mat & a,const Mat & b){
Mat ans;
for(int i = ; i <= m; i++){
for(int j = ; j <= m; j++){
ans.a[i][j] = ;
for(int k = ; k <= m; k++){
ans.a[i][j] += a.a[i][k]*b.a[k][j];
if(ans.a[i][j] > M)ans.a[i][j] %= M;
}
}
}
return ans;
}
Mat quick_pow(Mat a,ll b){
Mat t;
for(int i = ; i <= m; i++)t.a[i][i] = ;
while(b){
if(b & )t = mul(t,a);
b >>= ;
a = mul(a,a);
}
return t;
}
int main(){
//freopen("data.in","r",stdin);
_____
cin >> n >> m;
if(n < m){cout << << '\n';}
else{
Mat ans,t;
for(int i = ; i < m; i++){
ans.a[i+][i] = ;
}
ans.a[][m] = ans.a[m][m] = ;
ans = quick_pow(ans,n-m);
Mat a;
for(int i = ; i < m; i++)a.a[][i] = ;
a.a[][m] = ;
a = mul(a,ans);
cout << a.a[][m] << '\n';
}
return ;
}
[递推+矩阵快速幂]Codeforces 1117D - Magic Gems的更多相关文章
- HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)
Recursive sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
- hdu 2604 递推 矩阵快速幂
HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...
- HDU 2842 (递推+矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...
- Recursive sequence HDU - 5950 (递推 矩阵快速幂优化)
题目链接 F[1] = a, F[2] = b, F[i] = 2 * F[i-2] + F[i-1] + i ^ 4, (i >= 3) 现在要求F[N] 类似于斐波那契数列的递推式子吧, 但 ...
- HDU6030 Happy Necklace(递推+矩阵快速幂)
传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...
- 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)
题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...
- LightOJ 1244 - Tiles 猜递推+矩阵快速幂
http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...
- 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)
Happy Necklace Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- [hdu 2604] Queuing 递推 矩阵快速幂
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
随机推荐
- 第一个electron
1 开发环境:node环境 2 下载electron:npm install electron --save-dev 3 package.json配置如下: { "name": & ...
- Mac 字典扩充包 包括 app
https://pan.baidu.com/s/1htKUaiWZFZJGO6w9azsbsg
- DOCTYPE导致MyEclipse无法正常格式化HTML的问题
今天遇到在JSP代码中Ctrl+F无法正常格式化HTML代码,经过排查是DOCTYPE的原因. 之前写的是: <!DOCTYPE html PUBLIC "-//W3C//DTD XH ...
- 本人擅长Ai、Fw、Fl、Br、Ae、Pr、Id、Ps等
本人擅长Ai.Fw.Fl.Br.Ae.Pr.Id.Ps等软件的安装与卸载,精通CSS.JavaScript.PHP.ASP.C.C++.C#.Java.Ruby.Perl.Lisp.python.Ob ...
- 用PHP读取Excel、CSV文件
PHP读取excel.csv文件的库有很多,但用的比较多的有: PHPOffice/PHPExcel.PHPOffice/PhpSpreadsheet,现在PHPExcel已经不再维护了,最新的一次提 ...
- mongodb安装 超级管理 普通用户
安装MongoDB #1.配置mongo的yum源sudo vi /etc/yum.repos.d/mongodb-org-3.4.repo [mongodb-org-3.4]name=MongoDB ...
- Flink基本概念
Flink基本概念 1.The history of Flink? 2.What is Flink? Apache Flink是一个开源的分布式.高性能.高可用.准确的流处理框架,主要由Java代码实 ...
- python中正则表达式re模块详解
正则表达式是处理字符串的强大工具,它有自己特定的语法结构,有了它,实现字符串的检索,替换,匹配验证都不在话下. 当然,对于爬虫来说,有了它,从HTML里提取想要的信息就非常方便了. 先看一下常用的匹配 ...
- ruby 批量下载王者荣耀皮肤
主要采用ruby Parallel库提供的多线程方式: require 'unirest' require 'open-uri' require 'parallel' require 'json' u ...
- Simple, Poetic, Pithy
源自:Rob Pike points out Simple, Poetic, Pithy Don't communicate by sharing memory, share memory by co ...