题目背景

没有背景

我写不出来了qwq

题目描述

Chino给定了nn个数a_1...a_na1​...an​,给定常数s,m,她会轮流对这nn个数做k组操作,每组操作包含以下几步:

1.swap(as​,am​)(交换a_s,a_m​)

2.2将n个数都向前平移一位(第11个移动到第n个位置上)

Chino想知道,k组操作后,这nn个数分别是多少?

Orz yky,dyh,wjk,jjy,cxr,gsy,cpy,zcy,tyz,yy,hz,zhr,yg

输入格式

第一行,四个数,n,s,m,k

接下来一行n个数,分别代表a_1,a_2...a_na1​,a2​...an​

输出格式

输出一行,n个数,分别代表a_1,a_2...a_na1​,a2​...an​

输入输出样例

输入 #1复制

4 1 2 3
1 2 3 4
输出 #1复制

1 2 3 4

说明/提示

所有数字均在long long以内

思路:

  矩阵加速递推,构造两个矩阵,一个存交换操作,一个存位移操作。

  假如交换1和2:

      0 1 0 0

      1 0 0 0

      0 0 0 1

      0 0 0 1

  位移操作,所有往前移一位,

         0 1 0 0

      0 0 1 0

      0 0 0 1

      1 0 0 0    

矩阵快速幂求解K次方,即操作次数:

jz ksm(jz a,int 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;
// a=a*a;当时出错了,因为前面已经计算
}
return anss;
}

重载乘号:

struct jz{
int c[100][100];
}f,base,l1,l2;
int n,m,s,k;
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;
}

 代码:

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cmath>
#include<cstring>
#define int long long
using namespace std;
struct jz{
int c[100][100];
}f,base,l1,l2;
int n,m,s,k;
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;
}
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;
}
}
jz ksm(jz a,int 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;
// a=a*a;
}
return anss;
}
signed main()
{
scanf("%lld%lld%lld%lld",&n,&s,&m,&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)l1.c[i][i]=1;
l1.c[s][m]=l1.c[m][s]=1;
for(int i=1;i<=n-1;i++)l2.c[i][i+1]=1;
l2.c[n][1]=1;
base=l1*l2;
base=ksm(base,k);
f=f*base;
for(int i=1;i<=n;i++)printf("%lld ",f.c[i][1]);
cout<<endl;
dy(l1);
cout<<endl;
dy(l2);
return 0;
}

  

感谢wlj_dy 的帮助

【luoguP5550】Chino的数列的更多相关文章

  1. Chino的数列

    题解: 一道练代码能力的题目.. 首先很显然他是一道平衡树裸题 第5个操作是势能分析维护最大值最小值就可以了 另外设置虚点和noip2017队列那题一样(不过我只写过线段树) 具体细节: 1.内存池, ...

  2. C#求斐波那契数列第30项的值(递归和非递归)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. BZOJ1500[NOI2005]维修数列

    Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...

  4. PAT 1049. 数列的片段和(20)

    给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段.例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1 ...

  5. 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)

    对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...

  6. fibonacci数列(五种)

    自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...

  7. js中的斐波那契数列法

    //斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...

  8. 洛谷 P1182 数列分段Section II Label:贪心

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  9. 剑指Offer面试题:8.斐波那契数列

    一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...

随机推荐

  1. shell习题第12题:批量创建用户

    [题目要求] 用shell脚本实现如下需求 添加user_00 -- user_09 10个用户,并且给他们设置一个随机密码,密码要求10位包含大小写字母及数字,注意要把每个用户的密码记录到一个日志文 ...

  2. Docker学习+遇坑笔记

    基础命令: 1.Docker启动:docker-machine start default 2.Docker关闭:  docker-machine stop default 3.查看当前运行的Dock ...

  3. 怎样获取当前网页的URL

    1. document.documentURI document.documentURI; // "https://i.cnblogs.com/EditPosts.aspx?opt=1&qu ...

  4. redis常用api

    一.全局命令 1.keys *            //查看所有键 2.dbsize           //键总数,如果存在大量键,线上禁止使用此命令 3.exists key     //存在返 ...

  5. NetCore2.x 使用Log4Net(一)

    前言:本章仅仅是Log4Net的基本简单的运用,后续章节会按照我的项目使用情况进行深入研究 1.项目搭建 新建一个基于.netCore2.x的Web项目          =>   过程略 给新 ...

  6. 微信公众号支付备忘及填坑之路-java

    一.背景 最近公司给第三方开发了一个公众号,其中最重要的功能是支付,由于是第一次开发,遇到的坑特别的多,截止我写博客时,支付已经完成,在这里我把遇到的坑记录一下(不涉及退款).不得不吐槽一下,腾讯这么 ...

  7. JDK + Tomcat 安装 + 制作自定义镜像【第 2 篇 Tomcat】

    [第 1 篇 JDK]:https://www.cnblogs.com/del88/p/11842387.html[第 2 篇 Tomcat]:https://www.cnblogs.com/del8 ...

  8. java进程被OOM干掉问题记录

    异常现象:用户环境部署了一台iserver,访问一阵后,进程没了   分析: 1.bin目录下没有崩溃日志,在tomcat的访问日志里面也没有看到有用的信息.iserver.log里面也没有信息 2. ...

  9. Java虚拟机(JVM)知多少

    本文大量参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html 概述 JVM是JRE的一部分.它是一个虚构出来的计算机,是通过在实际的计算机上仿 ...

  10. Vue介绍:vue导读2

    一.实例中的成员 二.高级指令 三.组件初识 一.实例中的成员 # 计算computed <!DOCTYPE html> <html> <head> <met ...