传送门:https://www.luogu.org/problemnew/show/P5004


分析

动态规划转移方程是这样的\(f[i]=\sum^{i-m-1}_{j=0}f[j]\)。
那么很明显的是要构造举证,而且要维护前缀和,所以需要保留\(m+1\)项。

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define N 25
#define mod ((int)1e9 + 7)
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-') fl = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= fl;
}
ll n;
int m;
struct Matrix {
    int a[N][N], x, y;
    void init() {
        memset(a, 0, sizeof(a));
        x = y = 0;
    }
    Matrix operator *(const Matrix &rhs) const{
        Matrix res; res.init();
        res.x = x, res.y = rhs.y;
        int c = y;
        for (int i = 1; i <= x; i ++) {
            for (int j = 1; j <= y; j ++) {
                for (int k = 1; k <= c; k ++) {
                    res.a[i][j] = (res.a[i][j] + (ll) a[i][k] * rhs.a[k][j]) % mod;
                }
            }
        }
        return res;
    }
    Matrix power(Matrix a, ll b) {
        Matrix res;
        res.init();
        res.x = res.y = a.x;
        for (int i = 1; i <= res.x; i ++) res.a[i][i] = 1;
        for (; b; b >>= 1) {
            if (b & 1) res = res * a;
            a = a * a;
        }
        return res;
    }
}a, b;
int main() {
    read(n); read(m);
    if (n <= m) {
        printf("%lld\n", n + 1);
        return 0;
    }
    a.x = a.y = m + 2, b.x = m + 2, b.y = 1;
    for (int i = 2; i <= m + 2; i ++)
        b.a[i][1] = 1;
    b.a[1][1] = m + 1;
    a.a[1][1] = a.a[1][2] = 1;
    a.a[2][2] = a.a[2][m + 2] = 1;
    for (int i = 3; i <= m + 2; i ++) a.a[i][i - 1] = 1;
    a = a.power(a, n - m);
    b = a * b;
    printf("%d\n", b.a[1][1]);
    return 0;
}

[luogu5004]专心OI - 跳房子【矩阵加速+动态规划】的更多相关文章

  1. Luogu-5004 专心OI-跳房子(矩阵快速幂)

    Luogu-5004 专心OI-跳房子(矩阵快速幂) 题目链接 题解: 先考虑最朴素的dp 设\(f[i][0/1]\)表示第\(i\)个位置跳/不跳的方案数,则: \[ \begin{cases} ...

  2. 洛谷【P5004 专心OI - 跳房子】 题解

    题目链接 https://www.luogu.org/problem/P5004 洛谷 P5004 专心OI - 跳房子 Imakf有一天参加了PINO 2017 PJ组,他突然看见最后一道题 他十分 ...

  3. 【LuoguP5004】 专心OI - 跳房子

    首先这是一道计数类DP,那我们得先推式子,经过瞎掰乱凑,经过认真分析,我们可以得到这样的方程 F(N)=F(0)+F(1)+....+F(N-M-1) 所有F初值为1,F(1)=2 ANS=F(N+M ...

  4. 「P5004」专心OI - 跳房子 解题报告

    题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i ...

  5. ZZH与计数(矩阵加速,动态规划,记忆化搜索)

    题面 因为出题人水平很高,所以这场比赛的题水平都很高. ZZH 喜欢计数. ZZH 有很多的数,经过统计,ZZH一共有 v 0 v_0 v0​ 个 0 , v 1 v_1 v1​ 个 1,-, v 2 ...

  6. HDU 5564 Clarke and digits 状压dp+矩阵加速

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5564 题意: 求长度在[L,R]范围,并且能整除7的整数的总数. 题解: 考虑最原始的想法: dp[ ...

  7. 【 CodeForces - 392C】 Yet Another Number Sequence (二项式展开+矩阵加速)

    Yet Another Number Sequence Description Everyone knows what the Fibonacci sequence is. This sequence ...

  8. 【HDU 3483】 A Very Simple Problem (二项式展开+矩阵加速)

    A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

  9. 【HDU3802】【降幂大法+矩阵加速+特征方程】Ipad,IPhone

    Problem Description In ACM_DIY, there is one master called “Lost”. As we know he is a “-2Dai”, which ...

随机推荐

  1. Jenkins [Error] at org.codehaus.cargo.container.tomcat.internal.AbstractTomcatManagerDeployer.redeploy(AbstractTomcatManagerDeployer.java:192)

    Deploying /root/.jenkins/workspace/zgg-crm-pre/target/crm.war to container Tomcat 7.x Remote with co ...

  2. CentOS7 下面安装jdk1.8

    1. 卸载已有的jdk rpm -qa |grep jdk |xargs rpm -e --nodeps 2. 使用xftp上传 jdk 的文件我这里上传的是 jdk-8u121-linux-x64. ...

  3. 【Java编译】含package的类文件编译

    含package的类文件编译: package com.zhangxueliang.setdemo; public class Demo1 { public static void main(Stri ...

  4. centos6.5安装配置NTP,集群各机器间时间同步

    试验环境 提君博客原创 >>提君博客原创  http://www.cnblogs.com/tijun/  << IP 主机名 角色 描述 同步方式 192.168.11.11 ...

  5. Day 5-4封装.__隐藏属性或者方法

    封装 property 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 在python中用双下划线开头的方式将属性隐藏起来(设置成 ...

  6. liunx 运维知识三部分

    一. 用户级用户组相关 二. 文件属性和链接知识及磁盘已满故障案例 三. 通配符 四. 特殊符号 五. 基础正则 六. 扩展正则 七. sed实践 八. awk实践

  7. NOIP2016提高组复赛C 愤怒的小鸟

    题目链接:http://uoj.ac/problem/265 题目大意: 太长了不想概括... 分析: 状压DP的模板题,把所有可能的抛物线用二进制表示,然后暴力枚举所有组合,详情见代码内注释 代码如 ...

  8. Centos rpm包安装PHP所需包

    yum -y install php php-devel php-fpm php-xml php-pdo php-ldap php-mysql

  9. Python 版百度站长平台链接主动推送脚本

    如果自己的网站需要被百度收录,可以在搜索结果中找到,就需要将网站的链接提交给百度.依靠百度的爬虫可能无法检索到网站所有的内容,因此可以主动将链接提交给百度. 在百度的站长平台上介绍了链接提交方法,目前 ...

  10. cmd & tree & bash

    cmd & tree & bash bug E: Unable to locate package tree solution # 1. update $ sudo apt-get u ...