模拟赛 Chino的数列

矩阵加速递推

n的范围比较小,k的范围很大,我们可以考虑从n入手。

1.首先我们知道任何矩阵*单位矩阵都不会改变.

所以对于交换操作,我们可以造出一个这样的矩阵:

除了第s、m行,其他每一行都是f[i][i]=1;

第s行:f[s][m]=1;第m行:f[m][s]=1;

这样我们就完成了交换操作。

2.对于左移操作,我们也可以造出一个这样的矩阵:

除了第n行,其他每一行都是f[i][i+1]=1;

第n行:f[n][1]=1;

3.我们的初始矩阵f[i][1]=a[i];

因为矩阵符合结合律,所以我们可以用类似快速幂的方法加速。

然后就可以啦,时间复杂度O(\(n^3 \times log(k)\)).

献上我又臭又长的代码

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
long long n,s,m,k;
struct jz
{
    long long c[85][85];
}f,base,lin1,lin2;
jz operator * (const jz &a,const jz &b)//矩阵重载乘号
{
    jz lin;
    for(int i=1;i<=80;++i)
    {
        for(int j=1;j<=80;++j)
        {
            lin.c[i][j]=0;
            for(int k=1;k<=80;++k)
            {
                lin.c[i][j]+=(a.c[k][j]*b.c[i][k]);
            }
        }
    }
    return lin;
}
jz ksm(jz a,long long b)
{
    jz anss;
    memset(anss.c,0,sizeof(anss.c));
    for(int i=1;i<=n;++i)anss.c[i][i]=1;
    for(;b;b>>=1,a=a*a)
    {
        if(b&1)
        anss=a*anss;
    }
    return anss;
}
void dy(jz x)//调试用的,可以忽略
{
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        cout<<x.c[i][j]<<" ";
        cout<<endl;
    }
}
int main()
{
    cin>>n>>m>>s>>k;
    for(int i=1;i<=n;++i)scanf("%lld",&f.c[i][1]);
    for(int i=1;i<=n;++i)if(i!=s&&i!=m)lin1.c[i][i]=1;
    lin1.c[s][m]=lin1.c[m][s]=1;
    for(int i=1;i<=n-1;++i)lin2.c[i][i+1]=1;
    lin2.c[n][1]=1;
    base=lin1*lin2;
    base=ksm(base,k);
    f=f*base;
    for(int i=1;i<=n;++i)printf("%lld ",f.c[i][1]);
    return 0;
}

原文地址:https://www.cnblogs.com/wljss/p/11496674.html

时间: 2024-10-12 13:01:07

模拟赛 Chino的数列的相关文章

[模拟赛] T2 不等数列

Description 将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入">"和"<".问在所有排列中,有多少个排列恰好有k个"<".答案对2015取模. 注:1~n的排列指的是1~n这n个数各出现且仅出现一次的数列. Input 第一行2个整数n,k. Output 一个整数表示答案. Range 对于30%的数据:n <= 10 对于100%的数据:k < n <= 1000 Solutio

9.14 模拟赛

模拟赛第三弹~ T1 题意:给你一个数列,要求删掉任意一种整数,使得剩下的新数列中连续的相等的数最多 例如 2 7 3 7 7 3 3 7 7 5 7,删掉3以后剩的7有四个连续的,最多 思路:暴力枚举去掉哪个......这算是一道水题吧 代码丢了...... TAT T2 题意:有n本书,每本书有宽度和高度.现在你有无数个书架,每个书架的宽度为w,高度由最高的书决定 问在书本按顺序放的情况下,总的书架高度最小是多少 思路:dp,dp[i]表示做到第i本书时的最小高度和. 每次先找到能以编号j的

[GRYZ]寒假模拟赛

写在前面 这是首次广饶一中的OIERS自编自导,自出自做(zuo)的模拟赛. 鉴于水平气压比较低,机(wei)智(suo)的WMY/XYD/HYXZC就上网FQ下海找了不少水(fei)题,经过他们优(le)美(se)的文字加工后,有故事有题目有人物有奸情的模拟赛正式呈上. 我是正文 题目名 GRYZ娱乐时刻 GRYZ追击时刻 GRYZ就餐时刻 源文件 hyxzc.cpp/c/pas clikar.cpp/c/pas eat.cpp/c/pas 输入文件 hyxzc.in clikar.in ea

2014-11-3 NOIP模拟赛2

NOIP 2014 水题模拟赛 (请选手务必仔细阅读本页内容) 一.题目概况 中文题目名称 数列 刷漆 排队 英文题目与子目录名 seq paint layout 可执行文件名 seq paint layout 输入文件名 seq.in paint.in layout.in 输出文件名 seq.out paint.out layout.out 每个测试点时限 2 秒 1 秒 1 秒 测试点数目 10 10 10 每个测试点分值 10 10 10 附加样例文件 无 无 无 结果比较方式 全文比较(

NOIP模拟赛 6.29

2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走,厉害吧. 早苗的新模型可以按照输入的命令进行移动,命令包括‘E’.‘S’.‘W’.‘N’四种,分别对应东南西北.执行某个命令时,它会向对应方向移动一个单位.作为新型机器人,它可以执行命令串.对于输入的命令串,每一秒它会按命令行动一次.执行完命令串的最后一个命令后,会自动从头开始循环.在0时刻时机器人

2012-10-20 NOIP模拟赛

      2012-10-20 NOIP模拟赛 by coolyangzc 共3道题目,时间3小时 题目名 高级打字机 不等数列 经营与开发 源文件 type.cpp/c/pas num.cpp/c/pas exploit.cpp/c/pas 输入文件 type.in num.in exploit.in 输出文件 type.out num.out exploit.out 时间限制 1000MS 1000MS 1000MS 内存限制 256MB 256MB 256MB 测试点 5+(5) 10

11.27 模拟赛

并没有人做的模拟赛... 出题人hx,,, T1:就是上一道矩阵乘法 数学题 T2: 一个数列中 一个区间满足,存在一个k(L <= k <= R),并且对于任意的i (L <= i <= R),ai都能被ak整除 这样的一个特殊区间 [L, R]价值为R - L 想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢 这些区间又分别是哪些呢 输出每个区间的L 思路: 用两个ST表分别求一段区间的gcd和最小值 然后可以二分答案 check的时候枚举左端点,判断在这段区间

2017.12.09【NOIP提高组】模拟赛A组

2017.12.09[NOIP提高组]模拟赛A组 T1 3489. [NOIP2013模拟联考11]数列的GCD(gcd) T2 3500.[NOIP2013模拟联考15]物语(monogatari) T3 3501.[NOIP2013模拟联考15]消息传递(news) 吐槽:这次的题好像有点水啊,但最简单的第二题都给打挂啦!!(数组开小了) T1 本套题中最难的题.考虑dp 设f[i]是b[1],b[2]...b[N]的最大公约数的数目,g[i]是b[1],b[2]...b[N]的公约数的数目

20180520模拟赛T3——chess

[问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\)的时候,马在原点.每个时刻马都跳一步. 可是这个坐标图有点残缺,有几个点是不能跳到的. 然后小美很好奇在\(time=[0,K]\)中,马能跳到多少个不同的格子. [输入格式] 从文件chess.in中读入数据. 第一行两个数K,n表示时间上限和残缺的点的数量. 接下来n行,每行一个坐标 xi,yi