传送门: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的更多相关文章

  1. HDU 5950 Recursive sequence 【递推+矩阵快速幂】 (2016ACM/ICPC亚洲区沈阳站)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  2. hdu 2604 递推 矩阵快速幂

    HDU 2604 Queuing (递推+矩阵快速幂) 这位作者讲的不错,可以看看他的 #include <cstdio> #include <iostream> #inclu ...

  3. HDU 2842 (递推+矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842 题目大意:棒子上套环.第i个环能拿下的条件是:第i-1个环在棒子上,前i-2个环不在棒子上.每个 ...

  4. 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] 类似于斐波那契数列的递推式子吧, 但 ...

  5. HDU6030 Happy Necklace(递推+矩阵快速幂)

    传送门:点我 Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of ...

  6. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

  7. LightOJ 1244 - Tiles 猜递推+矩阵快速幂

    http://www.lightoj.com/volume_showproblem.php?problem=1244 题意:给出六种积木,不能旋转,翻转,问填充2XN的格子有几种方法.\(N < ...

  8. 2017中国大学生程序设计竞赛 - 女生专场 Happy Necklace(递推+矩阵快速幂)

    Happy Necklace Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  9. [hdu 2604] Queuing 递推 矩阵快速幂

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

随机推荐

  1. HTML的块状、内联、内联块状元素的特点

    元素分类及特点: 1.块级元素: 在html中<div>. <p>.<h1>.<form>.<ul> 和 <li>就是块级元素. ...

  2. Oracle行转列,pivot函数和unpivot函数

    pivot函数:行转列函数: 语法:pivot(任一聚合函数 for 需专列的值所在列名 in (需转为列名的值)):unpivot函数:列转行函数: 语法:unpivot(新增值所在列的列名 for ...

  3. Const 关键字详解

    const 标识符 在c++中作为常量修饰符 用来修饰 函数 变量  指针 const 修饰的变量不可以改变值 const 在修饰指针的时候 const 标识符出现在*的左边表示 指向的变量为常量不能 ...

  4. linux系统基础之六--系统引导(基于centos7.4 1708)

  5. 06JavaScript变量

    JavaScript 变量 变量是用于存储信息的"容器". var x=5; var y=6; var z=x+y; 就像代数那样 x=5 y=6 z=x+y 在代数中,我们使用字 ...

  6. python__基础 : 多继承中方法的调用顺序 __mro__方法

    在多继承中,如果一个子类继承了两个平级的父类,而这两个父类有两个相同名字的方法,那么一般先继承谁,调用方法就调用先继承的那个父类的方法.如: class A: def test(self): prin ...

  7. hadoop生态搭建(3节点)-08.kafka配置

    如果之前没有安装jdk和zookeeper,安装了的请直接跳过 # https://www.oracle.com/technetwork/java/javase/downloads/java-arch ...

  8. usb之鼠标作为按键输入

    1. 首先搞清楚,鼠标点左键.右键等能得到什么数据,然后分析这些数据上报事件即可. 第一个基本点:usb_alloc_urb函数,创建一个struct urb结构体,只能使用这个函数来创建,它是urb ...

  9. buck型DC-DC分析

    BUCK型DC/DC电源分析 这种buck型DC/DC电路的拓扑结构:( 1N5822叫续流二极管!) LM2756相当于高速断开和闭合的开关,连接在Vin与Vout脚之间. 1. 在开关闭合时,电流 ...

  10. python 自定义函数表达式 拟合求系数

    https://docs.scipy.org/doc/scipy/reference/tutorial/integrate.html https://docs.scipy.org/doc/scipy/ ...