[luogu5004]专心OI - 跳房子

传送门: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;
}

原文地址:https://www.cnblogs.com/chhokmah/p/10568032.html

时间: 2024-11-09 09:56:02

[luogu5004]专心OI - 跳房子的相关文章

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

题面 把\(N\)个无色格子排成一行,选若干个格子染成黑色,要求每个黑色格子之间至少间隔\(M\)个格子,求方案数 思路: 矩阵加速 根据题面,这一题似乎可以用递推 设第\(i\)个格子的编号为\(i\),有\(i\)个格子时的方案数为\(f(i)\) 显然,当 \(i \le M+1\) 时, 可以所有格子不染色(方案数为\(1\)种,或者最多有一个格子染色(方案数为\(i\)种) 所以有\(f(i)=i+1\) 当\(i>M+1\)时, 对于第\(i\)个格子可以由第\(i-1\)个格子转移

NOI2016 高中OI生涯的最后一站

你乘坐的航班XXX已经抵达终点站——四川绵阳. “呼——”机舱外的天空灰沉沉的,不禁有些压抑与紧张. 一出机场,就看见南山中学的牌子,黄色衣服的志愿者们,还有热情的老师们. 感觉刚才的情绪又一扫而空了,转而迎来的是一种兴奋与激动. 学长和教练都曾说过:就当做一次展现自己实力的机会.从来不要给自己太大压力. 这样的话大多也埋在心里了吧,潜移默化的影响着自己的心情. 那就开心的去面对这几场考试好了. 首先领好东西,还去签名版上签了个名字,发现湖南参赛的选手果然好多呀...不过不知道今年能不能翻身成强

OI回忆录——梦开始的地方

前言 谨以此文,纪念和整理我在OI之路上的奔波历程. 或许,等到或早或晚都要来临的退役真正来临时,再写回忆录,就晚了,那么,趁现在,自信还在,青春犹存,整理一下我慢慢的OI路吧. 我真正开始接触OI是初一下的暑假,一次无意间翻淘宝时,看到了一篇写 Scratch的这种图形化编程的书,突发奇想求妈妈把它买了下来,一到手,我就对它爱不释手,感觉这是信息学是一门十分深奥的学问,现在想想,Scratch只不过是一种非常简单的编程语言,一本面向低龄儿童的超入门级书籍.但是正是它领着我走进了OI的殿堂,随着

oi经历的一些往事

在实验报告和电子学/大物里扑腾的时候总会怀念以前学oi的时候--现在只有每周数学兴趣小组能感受到那种单纯的快乐了.以前很多快乐的点点滴滴现在想起来还很生动,想趁着没忘先记下来. 小学 TODO 初中 TODO 高一 上了高一之后很快来了一次noip.查了一下当时的成绩,是340,比初三还差. 刚上高中的时候我应该还沉浸在学习文化课的快乐中(雾),没怎么训练oi.后来学校开始让我们学竞赛了,作为"第一届创新班",我们是学校里第一届成规模学竞赛的--当然老师们也是第一次弄这个.学校让我们每

第一天学OI的萌新的跟dalao相比微不足道的小发言

#include<iostream> using namespace std; int main() { long long a,b,c,d; cin>>a; b=a/31104000+1970; c=(a/2592000)%12+1; d=(a/86400)%30+1; cout<<b<<' '<<c<<' '<<d<<endl; return 0; } 今天第一天学习OI,就被一串串复杂到炸的代码整到找不到

OI....................

我想OI是个好东西,没错. 只是这个比较难弄,一般都要钻研许久的,不过其乐趣也在其中. 不过......(今天在机房被喷了一身墨水....... 墨水大法好 Orz Orz Orz Orz Orz Orz ) 希望下一届OI学子可以学好..... Believe that. (算了我不想肉麻)

【OI新闻】2016.10.09

号外: [头条]今天OI神犇光勋和原子城po ke,Happy Birthday!

Openjudge NOI题库 ch0111/10 河中跳房子|NOIP2015 day2 stone

这题同时也是NOIP2015 D2T1 跳石头 stone 原题. 总时间限制: 1000ms 内存限制: 65536kB 描述 每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石.这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000) 的终点处均有一个岩石.在起点和终点之间,有N (0 ≤ N ≤ 50,000) 个岩石,每个岩石与起点的距离分别为Di (0 < Di < L). 在比赛过程中,奶牛轮流从起点

OI 中的 FFT

不行啊最近备考简直变成文化狗了= =..我还脑洞大开想学俄语什么心态.. 简单地说一下FFT(来,跟我一起念,法?法?塔,法斯特~福铝页~圈死佛而母).. FFT本来是做信号变换用的,当然OI和信号变换搭不上边.但是大家都知道,FFT可以快速求卷积.这可以说是由复数的性质决定的. FFT是什么 FFT,是DFT的一种实现.它可以在$\theta \left( n\log_2{n}\right)$(其中n为输入规模)时间内完成DFT. 也就是说,FFT是DFT的一种具体实现.因此,与其问FFT是什