题目背景

没有背景

我写不出来了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 的帮助

转载于:https://www.cnblogs.com/yelir/p/11525619.html

【luoguP5550】Chino的数列相关推荐

  1. P5550 Chino的数列

    P5550 Chino的数列 解题思路: 假设有一个矩阵basebasebase n=4,s=2,m=4n=4,s=2,m=4n=4,s=2,m=4 [a1a2a3a4]∗base=[a4a3a2a1 ...

  2. [题解]P5550 |Chino的数列

    题目链接 人生第一道矩乘题,一遍过 分析 对于数据范围进行分析,\(n\) 很小而 \(k\) 很大,可以考虑到矩阵快速幂优化递推 考虑构造一个矩阵来存储 \(a\) 数组, 即:\(A=\left\ ...

  3. 【洛谷 P5550】 Chino的数列【矩阵乘法】

    解题思路 矩阵乘法呀 考虑构造一个操作矩阵 CC[1234]\begin{bmatrix} 1&2&3&4\\ \end{bmatrix}[1​2​3​4​] 首先把特殊情况s ...

  4. java 斐波拉_Java实现斐波那契数列

    斐波纳契数列,又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n&g ...

  5. 剑指offer:面试题10- I. 斐波那契数列

    写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项.斐波那契数列的定义如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 ...

  6. [NOI2005]维护数列

    输入格式 输入文件的第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目. 第 2 行包含 N 个数字,描述初始时的数列. 以下 M 行,每行一条命令,格式参见问题 ...

  7. 【BZOJ4282】慎二的随机数列 乱搞

    [BZOJ4282]慎二的随机数列 Description 间桐慎二是间桐家著名的废柴,有一天,他在学校随机了一组随机数列, 准备使用他那强大的人工智能求出其最长上升子序列,但是天有不测风云,人有旦夕 ...

  8. 用递归法计算斐波那契数列的第n项

     斐波纳契数列(Fibonacci Sequence)又称黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.--在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1, ...

  9. 循环斐波那契数列_剑指offer #10 斐波那契数列

    (递归和循环)#10 斐波那契数列 一.斐波那契数列 定义: n = 0 , f(n) = 0 n = 1 , f(n) = 1 n > 1 , f(n) = f(n-1) + f(n-2) 思 ...

最新文章

  1. Android Monkey使用
  2. 微软全球执行副总裁沈向洋:你给自己的定位是什么,你就会得到什么
  3. 把jquery的this写入选择器里(伪写入)哈哈~
  4. 【转】节点预测与边预测任务实践
  5. Method Not Allowed一例
  6. time zone issue in text processing
  7. 65 + iPhone应用程序网站创意设计灵感(上篇)
  8. 【渝粤题库】国家开放大学2021春2726畜禽生产概论题目
  9. 微信 for Mac 3.1.0 测试版发布(附安装包),新增「发朋友圈」功能
  10. 一个完整的c语言的单链表代码,单链表完整C语言纯代码.docx
  11. html轮播图显示失败_html简单的二级菜单制作
  12. AES-128\192\256加密算法及其安全脆弱分析
  13. http 网页突然报502 bad gateway,平台宕掉
  14. Atitit 数据表 资料整理 常见希腊罗马北欧神话神仙与中国对照表 目录1. 神仙体系 12. 神仙分类 13. 印度大神top10 23.1. 神仙列表约70个大神 21.神仙体
  15. 联想m7400更换墨粉盒怎么清零_联想M7400一体打印机换墨粉后如何清零?
  16. Unity 工具类 之 BlendShape 捏脸的实现
  17. Oracle删除数据消耗时间大吗,oracle 删除大量数据的方法
  18. 熔断机制什么意思_指数熔断机制是什么意思
  19. 关于如何在mac系统上安装Git并在码市上建立项目
  20. linux中一个用户可以同时属于多个组吗,为什么linux用户可以属于多个用户组,文件只能属于一个用户组?...

热门文章

  1. LeetCode 1 Two Sum
  2. Intel-4004微处理器(MCS-4微机)
  3. Google英文SEO优化更注重实效性
  4. 山东大学论坛的建立(世一大论坛)
  5. 参考文献管理软件Jabref和Zotero使用笔记
  6. Python 实现京东自动登录领京豆
  7. oracle通过值查字段,Oracle 中 根据值 查询 所在 表和字段
  8. [ISCC 2023] pwn部分
  9. 一文带你看懂算术编码(C语言)
  10. android汉字转拼音,不用第三方包