【luoguP5550】Chino的数列
题目背景
没有背景
我写不出来了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
输入输出样例
4 1 2 3
1 2 3 4
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的数列的更多相关文章
- Chino的数列
题解: 一道练代码能力的题目.. 首先很显然他是一道平衡树裸题 第5个操作是势能分析维护最大值最小值就可以了 另外设置虚点和noip2017队列那题一样(不过我只写过线段树) 具体细节: 1.内存池, ...
- C#求斐波那契数列第30项的值(递归和非递归)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- BZOJ1500[NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- 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 ...
- 斐波拉契数列加强版——时间复杂度O(1),空间复杂度O(1)
对于斐波拉契经典问题,我们都非常熟悉,通过递推公式F(n) = F(n - ) + F(n - ),我们可以在线性时间内求出第n项F(n),现在考虑斐波拉契的加强版,我们要求的项数n的范围为int范围 ...
- fibonacci数列(五种)
自己没动脑子,大部分内容转自:http://www.jb51.net/article/37286.htm 斐波拉契数列,看起来好像谁都会写,不过它写的方式却有好多种,不管用不用的上,先留下来再说. 1 ...
- js中的斐波那契数列法
//斐波那契数列:1,2,3,5,8,13…… //从第3个起的第n个等于前两个之和 //解法1: var n1 = 1,n2 = 2; for(var i=3;i<101;i++){ var ...
- 洛谷 P1182 数列分段Section II Label:贪心
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
随机推荐
- dede添加自定义变量不显示
dedecms前端无法调用自定义变量要怎么解决,登录他的网站后台看了一下,自定义变量已经添加了,也写入了数据库表中,但是就是前台没办法调用出来,后面想想可能是文件权限不够,具体是哪个文件呢?查了相关文 ...
- python之并发编程(概念篇)
一.进程 1.什么是进程 进程是正在进行的一个过程或者一个任务.而负责执行任务的则是cpu. 2.进程与程序的区别 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程 ...
- 【数据结构】P1054 等价表达式
[题目链接] https://www.luogu.org/problem/P1054 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数 ...
- Windows 证书签名的伪造
Windows 系统中的一些非常重要文件通常会被添加数字签名,其目的是用来防止被篡改,能确保用户通过互联网下载时能确信此代码没有被非法篡改和来源可信,从而保护了代码的完整性.保护了用户不会被病毒.恶意 ...
- Android 官方下拉刷新 SwipeRefreshLayout
0.build.gradle compile 'com.android.support:support-v4:23+' 1.布局文件 <android.support.v4.widget.Swi ...
- c# 粘贴复制
复制 1. 复制 Clipboard.SetText("123456"); Clipboard.SetImage(Image img); Clipboard.SetAudio(Sy ...
- Sharepoint2010设置自定义母版页
前言 这个文档是为Microsoft Sharepoint2010 上海文档库公司站点设计的母版页,其版本为1.0,为相关的源文件编写的使用说明书. 使用SharePoint Designer 201 ...
- 异常:Invalid character found in the request target. The valid characters are defined in RFC 3986
一.背景 事情是这样的,前几天做一个基本的数据库“增删改查”的需求,前端传参的方式是“JSON字符串”,后端接收到此参数后,使用阿里巴巴fastjson进行解析,然后入库.需求很简单吧,但是偏偏遇到问 ...
- JavaScript 的编译原理
JavaScript 是一门编译语言. JavaScript 的编译是发生在代码执行前的几微米(甚至更短)的事件内,所以 JavaScript 没有其他语言那么多的时间来进行优化. 当 JavaScr ...
- Redis和MemCache静态Map做缓存区别
本地缓存和分布式缓存 本地缓存:使用自带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不 ...