[题解]P5550 |Chino的数列
时间:2019-09-17
本文章向大家介绍[题解]P5550 |Chino的数列,主要包括[题解]P5550 |Chino的数列使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
人生第一道矩乘题,一遍过
分析
对于数据范围进行分析,\(n\) 很小而 \(k\) 很大,可以考虑到矩阵快速幂优化递推
考虑构造一个矩阵来存储 \(a\) 数组,
即:\(A=\left\|a_1,a_2,\cdots,a_n\right\|\)
操作1
我们把数组前移一位,利用矩阵乘法的原理,可以构造出 \(B_1\) 使
\(A*B_1=\left\|a_2,a_3,\cdots,a_n,a_1\right\|\)
如对于样例,\(B_1=\left\|\begin{array}{cc}0&0&0&1\\1&0&0&0\\0&1&0&0&\\0&0&1&0\end{array}\right\|\)
操作2
我们把数组交换两位,利用矩阵乘法的原理,可以构造出 \(B_2\) 使
\(A*B_2=\left\|a_1,a_2,\cdots,a_{s-1},a_m,a_{s+1},\cdots,a_{m-1},a_s,a_{m+1},\cdots,a_n\right\|\)
此时我们只需将单位矩阵中的两列交换即可
如对于样例,\(B_2=\left\|\begin{array}{cc}0&1&0&0\\1&0&0&0\\0&0&1&0&\\0&0&0&1\end{array}\right\|\)
结合
根据矩阵乘法那套理论手玩样例,将 \(B_1\) 和 \(B_2\) 相乘即可得到 \(B=B_1*B_2\)
根据矩阵乘法具有结合律,我可以用快速幂加速矩阵递推,则最终结果为 \(A*B^k\) 的第一行
代码
\(\mathcal{Code:}\)
#include<map>
#include<queue>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
#define int long long
#define debug cout<<__LINE__<<" "<<__FUNCTION__<<"\n"
inline int read(){
int x=0,y=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')y=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*y;
}
void put(int x){
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar((x%10)+48);
}
int n,s,m,t;
struct Martix{
int c[110][110];
Martix(){memset(c,0,sizeof c);}
friend Martix operator * (const Martix &x,const Martix &y){
Martix res;
for(int i=1;i<=n;i++)//枚举矩阵1的行
for(int j=1;j<=n;j++)//枚举矩阵2的列
for(int k=1;k<=n;k++)//累加
res.c[i][j]+=x.c[i][k]*y.c[k][j];
return res;
}
}ans,a;
inline Martix ksm(Martix a,int b){
Martix res;
for(int i=1;i<=n;i++) res.c[i][i]=1;//记得赋单位矩阵
while(b){
if(b&1) res=res*a;
a=a*a;
b>>=1;
}
return res;
}
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
n=read();s=read();m=read();t=read();
for(int i=1;i<=n;i++) ans.c[1][i]=read();
for(int i=1;i<=n;i++){//B1
a.c[i%n+1][i]=1;
}
swap(a.c[s],a.c[m]);//交换两列
//我直接将两个矩阵合并了,两种写法等价
ans=ans*ksm(a,t);
for(int i=1;i<=n;i++) cout<<ans.c[1][i]<<" ";
// fclose(stdin);
// fclose(stdout);
return 0;
}
原文地址:https://www.cnblogs.com/end-of-mind/p/11535534.html
- 用openssl库RSA加密解密
- Kobject浅析
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
- RSA简介(二)——模幂算法
- 为虚拟机vCPU绑定物理CPU
- RSA简介(三)——寻找质数
- RSA简介(四)——求逆算法
- 平方根的C语言实现(三) ——最终程序实现
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
- 【视频】Es6新特性-Symbol
- shell编程/字库裁剪(3)——验证
- 特征选择(Feature Selection)引言
- shell编程/字库裁剪(2)——编程过程
- 使用mock来编译和管理RPM软件包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 案例:强制开库遭遇ORA-16433的处理过程
- 叮~AutoML自动化机器学习入门指南,来了
- 注意:ORACLE 11G ADG RAC 这个情况下并不能高可用
- Nginx转发指向数据库端口并对外开放访问权限
- Python手写了 35 种可解释的特征工程方法
- Geant4--G4ParticleGun定义射线源的发射能谱
- Sony-PMCA-RE, 反向工程索尼PlayMemories相机应用
- 中标麒麟系统Your trial is EXPIRED and no VALID licens
- R初探
- 独家 | 在Python编程面试前需要学会的10个算法(附代码)
- 为什么一个还没毕业的大学生能够把 IO 讲的这么好?
- 如何将单 master 升级为多 master 集群
- 为 Kubernetes 节点发布扩展资源
- Kubernetes 资源预留配置
- PHP一些常见的漏洞梳理