[递推+矩阵快速幂]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 ...
随机推荐
- HTML&CSS 问题
1.子div使用浮动,父div高度自适应(个人感觉好用) 方法: css: <style> .clear{ clear:both} </style> html:在父div关闭之 ...
- unittest单元测试框架之unittest 框架的总结2(八)
unittest 下的属性 1.Unittest.TestCase:所有测试用例类继承的基本类 2.Unittest.main():将一个单元测试模块变为可直接运行的测试脚本 If __name__ ...
- asp.net mvc5 step by step(三)—— Entity Framework Database First
一.先建数据库. 打开,SQL Server Management 新建数据库Employee 并新建表 /****** Object: Table [dbo].[t_Employee] Script ...
- linux设置容器(中间件)开机自启
/etc/rc.d/rc.local JAVA_HOME=/usr/java/jdk1.6.0_45 su - goldsign -c '/home/goldsign/Oracle/Middlew ...
- js取一个对象中的另一个对象
最开始的截图 原本是想取到其中的foodName 先是用一个for循环循环了下 for (var i=0;i<res.data.length;i++) { this.goodsList.res. ...
- Mac 字典扩充包 包括 app
https://pan.baidu.com/s/1htKUaiWZFZJGO6w9azsbsg
- QQ好友的价值玩法 及如何搞到几万好友?
我们知道,现在的自媒体平台太多了.微信公众号,企鹅媒体平台,今日头条.搜狐.UC.一点等等等. 但是现在的话最主要的就是盈利,我们很多朋友玩自媒体这个在很多平台都有自己的账号和大量的粉丝.但是,最后大 ...
- yii学习笔记(6),数据库操作(增删改)
数据库增删改操作通过活动记录实例来完成 插入记录 /* ----------添加记录---------- */ // 创建活动记录对象 $article = new Article(); $artic ...
- s3c2440串口详解
一.UART原理说明 通用异步收发器简称UART(Universal Asynchronous Receiver/Transmitter),它用来传输串行数据:发送数据时,CPU将并行数据写入UART ...
- 树莓派如何连接WIFI
hello,大家好,我是叶秋! 上一期呢,给大家介绍了如何给树莓派安装系统,有细心的朋友就会发现上一期安装系统的文章漏了一点点知识,不知道机智的你是否有发现呢~~(尴尬