CF1117D Magic Gems
CF1117D Magic Gems
- 考虑 \(dp\) , \(f[i]\) 表示用 \(i\) 个单位空间的方案数,答案即为 \(f[n]\).
- 对于一个位置,我们可以放 \(Magic\) 的,占 \(m\) 空间,也可以放 \(Normal\) 的,占 \(1\) 空间.
- 转移方程即为 \(f[i]=f[i-1]+f[i-m]\) ,边界条件为 \(f[0]=f[1]=f[2]=\dots f[m-1]=1\).
- 直接转移是 \(O(n)\) 的,无法通过,需要矩阵优化.

- 时间复杂度为 \(O(m^3logn)\) ,可以通过本题.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
inline ll read()
{
ll x=0;
bool pos=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
pos=0;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return pos?x:-x;
}
const int MAXM=110;
const int P=1e9+7;
inline int add(int a,int b)
{
return (a + b) % P;
}
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
ll n;
int m;
struct Matrix{
int a[MAXM][MAXM];
Matrix()
{
for(int i=1;i<=m;++i)
for(int j=1;j<=m;++j)
a[i][j]=0;
}
Matrix operator * (const Matrix &rhs) const
{
Matrix res;
for(int k=1;k<=m;++k)
for(int i=1;i<=m;++i) if(a[i][k])
for(int j=1;j<=m;++j) if(rhs.a[k][j])
res.a[i][j]=add(res.a[i][j],mul(a[i][k],rhs.a[k][j]));
return res;
}
};
Matrix fpow(Matrix x,ll b)
{
Matrix res;
for(int i=1;i<=m;++i)
res.a[i][i]=1;
while(b)
{
if(b&1)
res=res*x;
x=x*x;
b>>=1;
}
return res;
}
int main()
{
n=read(),m=read();
if(n<m)
return puts("1")&0;
Matrix st;//st_{m-1}
for(int i=1;i<=m;++i)
st.a[i][1]=1;
Matrix trans;
trans.a[1][1]=trans.a[1][m]=1;
for(int i=2;i<=m;++i)
trans.a[i][i-1]=1;
st=fpow(trans,1LL*(n-m+1))*st;
cout<<st.a[1][1];
return 0;
}
CF1117D Magic Gems的更多相关文章
- 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 ...
- CoderForces-Round60D(1117) Magic Gems
D. Magic Gems time limit per test 3 seconds memory limit per test 256 megabytes input standard input ...
- [递推+矩阵快速幂]Codeforces 1117D - Magic Gems
传送门:Educational Codeforces Round 60 – D 题意: 给定N,M(n <1e18,m <= 100) 一个magic gem可以分裂成M个普通的gem ...
- D. Magic Gems(矩阵快速幂 || 无敌杜教)
https://codeforces.com/contest/1117/problem/D 题解:有一些魔法宝石,魔法宝石可以分成m个普通宝石,每个宝石(包括魔法宝石)占用1个空间,让你求占用n个空间 ...
- Educational Codeforces Round 60 D. Magic Gems
易得递推式为f[i]=f[i-1]+f[i-M] 最终答案即为f[N]. 由于N很大,用矩阵快速幂求解. code: #include<bits/stdc++.h> using names ...
- Educational Codeforces Round 60 (Rated for Div. 2) D. Magic Gems(矩阵快速幂)
题目传送门 题意: 一个魔法水晶可以分裂成m个水晶,求放满n个水晶的方案数(mol1e9+7) 思路: 线性dp,dp[i]=dp[i]+dp[i-m]; 由于n到1e18,所以要用到矩阵快速幂优化 ...
- eduCF#60 D. Magic Gems /// 矩阵快速幂
题目大意: 给定n m (1≤N≤1e18, 2≤M≤100) 一个魔法水晶可以分裂成连续的m个普通水晶 求用水晶放慢n个位置的方案modulo 1000000007 (1e9+7) input 4 ...
- CF集萃2
CF1155D - Beautiful Array 题意:给你一个序列和x,你可以选择任意一个子串(可以为空)乘上x,使得得到的序列最大子串和最大.求这个最大值.30w,2s. 解:设fi,0/1/2 ...
- hdu 5727 Necklace dfs+二分图匹配
Necklace/center> 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5727 Description SJX has 2*N mag ...
随机推荐
- Centos中使用Jenkins执行gulp命令:command not found
在Centos操作系统,使用Jenkins的pipeline执行发布流程:jenkinsfile如下: stage("前端项目构架gulp") { steps { dir('src ...
- js三种对话框
<html> <head> <script> function tip1(){ //这个基本没有什么说的,就是弹出一个提醒的对话框 alert("这个第一 ...
- head first python选读(5)
python web 开发 犯了低级错误,这本书看了一半了才知道书名应为<head first python>,不是hand first.. 现在开始一个web应用. 总算是熟悉的内容了. ...
- activity之间通过全局变量传递数据
activity之间通过全局变量传递数据 一.简介 Application域中的onCreate方法是Android程序的入口,Android程序运行的时候就自动加载Application的对象,感觉 ...
- import sys sys.path.append(...)
模块搜索路径: 当我们试图加载一个模块时,Python会在指定的路径下搜索对应的.py文件,如果找不到,就会报错 默认情况下,Python解释器会搜索当前目录.所有已安装的内置模块和第三方模块,搜索路 ...
- JS触发服务器控件的单击事件
<script src="../Js/jquery-1.4.2.min.js" type="text/javascript"></script ...
- 《高级Web应用程序设计》作业(20170904)
作业1(类型-理论学习,上传ftp,截止日期9月20日) 1.请写出ASP.NET MVC的优点. 2.请写出默认项目模板中以下文件夹或文件的作用.App_Data文件夹.Content文件夹.Con ...
- 为Pdf批量添加水印
Itext官网下载jar包 /** * PDF工具类 */ public class PdfUtil { public static void main(String[] args) throws E ...
- Android面试二之Fragment
基本概念 Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6. F ...
- Python写入CSV文件的问题
这篇文章主要是前几天我处理数据时遇到的三个问题: Python写入的csv的问题 Python2与Python3处理写入写入空行不同的处理方式 Python与Python3的编码问题 其实上面第3个问 ...