BZOJ 4417 超级跳马

dp前缀和优化+矩阵快速幂。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 110
#define mod 30011
using namespace std;
struct matrix
{
    int a[maxn][maxn];
}a,b;
int n,m,dp[maxn][5];
void get_table()
{
    for (int i=1;i<=n;i++) a.a[1][i]=dp[i][1];
    for (int i=1;i<=n;i++) a.a[1][n+i]=dp[i][2];
    for (int i=1;i<=n;i++) b.a[i+n][i]=1;
    for (int i=1;i<=n;i++) b.a[i][n+i]=b.a[max(n+i-1,n+1)][n+i]=b.a[n+i][n+i]=b.a[min(n+i+1,2*n)][n+i]=1;
}
matrix mul(matrix a,matrix b)
{
    matrix c;
    for (int i=1;i<=2*n;i++)
        for (int j=1;j<=2*n;j++)
            c.a[i][j]=0;
    for (int i=1;i<=2*n;i++)
        for (int j=1;j<=2*n;j++)
            for (int k=1;k<=2*n;k++)
                c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%mod)%mod;
    return c;
}
void f_pow(int y)
{
    matrix base=b;
    while (y)
    {
        if (y&1) a=mul(a,base);
        base=mul(base,base);
        y>>=1;
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    dp[1][1]=1;
    for (int i=1;i<=n;i++) dp[i][2]=(dp[i-1][1]+dp[i][1]+dp[i+1][1])%mod;
    for (int i=1;i<=n;i++) dp[i][3]=(dp[i-1][2]+dp[i][2]+dp[i+1][2]+dp[i][1])%mod;
    get_table();
    if (m==1) {if (n<=2) printf("1\n");else printf("0\n");return 0;}
    else if (m<=3) {printf("%d\n",(dp[n][m]-dp[n][m-2]+mod)%mod);return 0;}
    f_pow(m-3);
    int ret1,ret2;
    ret1=a.a[1][n];a=mul(a,b);ret2=a.a[1][2*n];
    printf("%d\n",(ret2-ret1+mod)%mod);
    return 0;
}
时间: 2025-01-05 22:03:22

BZOJ 4417 超级跳马的相关文章

bzoj 4769: 超级贞鱼 -- 归并排序

4769: 超级贞鱼 Time Limit: 1 Sec  Memory Limit: 128 MB Description 马达加斯加贞鱼是一种神奇的双脚贞鱼,它们把自己的智慧写在脚上——每只贞鱼的左脚和右脚上个有一个数.有一天,K只贞鱼兴致来潮(1≤k≤10^5),排成一列,从左到右第i只贞鱼会在右脚写Ai(1≤Ai≤10^9),左脚上写上i(1≤i≤K),第二年,这K只贞鱼按右脚的数从小到大排成一列,然后,它们决定重编号,从左到右第i只贞鱼会在右脚上写上左脚的数,在左脚上写i,第三年,它们

bzoj4417: [Shoi2013]超级跳马

裸矩阵快速幂. #include<cstdio> #define N 100 const int p=30011; int n,m; typedef int ds[N][N]; ds f,q,a; void mul(ds u,ds v){ for(int i=0;i!=n*2;++i) for(int j=0;j!=n*2;++j) a[i][j]=0; for(int i=0;i!=n*2;++i) for(int j=0;j!=n*2;++j) for(int k=0;k!=n*2;++k

BZOJ 2006 超级钢琴(堆+主席树)

很好的一道题. 题意:给出长度为n的数列,选择k个互不相同的区间,满足每个区间长度在[L,R]内,求所有选择的区间和的总和最大是多少.(n,k<=5e5). 首先将区间和转化为前缀和之差,那么我们想要区间和的总和最大,一个朴素的想法是把所有满足限制的区间和排序,取最大的k个. 考虑每个右端点i,其中有效的左端点是[i-R+1,i-L+1].如果我们对于每个右端点都找到"当前"最大的区间和,那么把它们扔进大根堆里维护一下即可. 由于sum[i]一定,那么只要左端点的sum值越小越好

【bzoj4417】[Shoi2013]超级跳马 矩阵乘法

题目描述 现有一个n行m列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.例如,当n = 3, m = 10时,下图是一种可行的跳法. 试求跳法种数mod 30011. 输入 仅有一行,包含两个正整数n, m,表示棋盘的规模. 输出 仅有一行,包含一个整数,即跳法种数mod 30011. 样例输入 3 5 样例输出 10 题解 矩阵乘法 设 $f[i][j]$ 表示跳到 $(i,j)$ 的方案数,那么 $f[i][j]=\sum\li

P3990 [SHOI2013]超级跳马

传送门 首先不难设\(f[i][j]\)表示跳到\((i,j)\)的方案数,那么不难得到如下转移 \[f[i][j]=\sum\limits_{k=1}^{\frac n2}f[i-2k+1][j-1]+f[i-2k+1][j]+f[i-2k+1][j+1]\] 然后维护两个前缀和\(s1,s2\),分别表示与当前列相差为偶数的前缀和以及与当前列相差为奇数的前缀和,那么可以这样转移 \[s1[i+1][j]=s2[i][j]+s1[i][j-1]+s1[i][j]+s1[i][j+1]\] \[

[题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化

这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你一个 n 行m 列 的格子图 一只马从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行. 题意很简单暴力dp的思路也很简单但是数据很恶心虽然远古一点,但毕竟是省选题 1 ≤ n ≤ 50,2 ≤ m ≤ 10^9 不过还是给了我们一点提示:n这么小? 总之我们先找出转移式对于每一个点

[SHOI 2013]超级跳马

Description 题库连接 现有一个 \(n\) 行 \(m\) 列的棋盘,一只马欲从棋盘的左上角跳到右下角.每一步它向右跳奇数列,且跳到本行或相邻行.跳越期间,马不能离开棋盘.试求跳法种数,取模. \(1\leq n\leq50,2\leq m\leq 10^9\) Solution 令 \(f_{i,j}\) 表示在第 \(i\) 列第 \(j\) 行的方案数.那么,\(f_{i,j}=\sum\limits_{k=1}^i\text{odd}(i-k)\cdot(f_{k,j-1}+

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw

2006: [NOI2010]超级钢琴 - BZOJ

Description小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为1至n.第i个音符的美妙度为Ai,其中Ai可正可负. 一个“超级和弦”由若干个编号连续的音符组成,包含的音符个数不少于L且不多于R.我们定义超级和弦的美妙度为其包含的所有音符的美妙度之和.两个超级和弦被认为是相同的,当且仅当这两个超级和弦所包含的音符集合是相同的. 小Z决定创作一首由k个超级和弦组成的乐曲,为了使得乐曲更加动听