矩阵快速幂的最简单用法

矩阵快速幂

链接:https://ac.nowcoder.com/acm/contest/1168/K
来源:牛客网

题目描述
这个勇者明明超强却过分慎重,勇者龙宫院圣哉与n名冒险者一起去讨伐神秘魔物,龙宫院圣哉十分谨慎,他只会在最后一刻出手,
每名冒险者轮流攻击魔物,冒险者的攻击有着某种规律,目前造成的总伤害是上一名冒险者攻击后造成的总伤害的4倍与上上名冒
险者攻击后造成的总伤害的3倍之和,即当前总伤害f(n)=4f(n-1)+3f(n-2)(魔物的奇怪设定使总伤害忽高忽低),又由于异世界的奇异设定,冒险者们的总伤害
不会超过666666,即对666666取模,龙宫院圣哉清楚的知道这个魔物的血量为m(m>666666),他想知道在所有的冒险者攻
击完了以后,自己需要造成多少点伤害才能杀死魔物?目前第一名冒险者攻击后总共造成了4点伤害,第二名冒险者攻击后总共造
成了233点伤害。
输入描述:
输入一行n,m,处理到文件结束

666666<m<1e9
2<n<1e9
输出描述:
输出一个整数
示例1
输入

3 666667
输出

665723
显然只是一道递推或者递归的题目。
递归代码如下

#include<iostream>
#define mood 666666
using namespace std;
long long what(int n)
{if(n==1)return 4;else if(n==2)return 233;elsereturn (what(n-1)*4+what(n-2)*3)%mood; 
}
int main()
{long long n,sum;while(cin>>n>>sum) {cout<<sum-what(n)<<endl;}
}

这种方法可处理n较小的情况,但是因为n最大可取到十亿,显然会超时,所以这里就用到了矩阵快速幂

第一步构造矩阵
在这里插入图片描述这样就构造了一个用于快速幂的矩阵,但是一定要注意构造的矩阵一定要是方阵,这样才能做多次相乘变换。

#include<bits/stdc++.h>
#define N 2               //由于这里只有两步递推关系,所以这里只要用一个2*2的矩阵
typedef long long ll;
#define mood 666666
using namespace std;
struct unit               //定义一个结构体后面便于设置二阶矩阵
{ll each[N][N];
};
unit what(unit a,unit b)					//用于矩阵相乘
{unit temp;for(int i=0;i<N;i++)for(int j=0;j<N;j++) {temp.each[i][j]=0;for(int k=0;k<N;k++) {temp.each[i][j]+=a.each[i][k]*b.each[k][j];temp.each[i][j]%=mood;}}return temp;				//返回矩阵相乘的结果
}
int main()
{int s,sum;while(cin>>s>>sum) {if(s==1) {cout<<sum-4<<endl;continue;}else if(s==2) {cout<<sum-233<<endl;continue;}unit a,b;a.each[0][0]=233,a.each[0][1]=4;		//初始化答案矩阵aa.each[1][0]=0,a.each[1][1]=0;			//和用于快速幂的矩bb.each[0][0]=4,b.each[0][1]=1;b.each[1][0]=3,b.each[1][1]=0;s-=2;while(s>0) {if(s&1)a=what(a,b);b=what(b,b);s >>= 1;}cout<<sum-a.each[0][0]<<endl;}	
}

这就是矩阵快速幂,在快速幂的基础上用一个矩阵来构造
最主要的就是构造用于快速幂的矩阵,
当然,我这里举的例子比较简单构造。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevOps案例研究|史上最能“拜客户教”的公司,是如何做到持续交付的?(第1趴)...

内容来源&#xff1a;DevOps案例深度研究 –Amazon持续交付之道战队&#xff08;本文只展示部分PPT及研究成果&#xff0c;更多细节请关注案例分享会&#xff0c;及本公众号。&#xff09;本案例内容贡献者&#xff1a;单冰 (Topic Leader)、 赵栋、梁兴龙、李杰、毛艳清、牛恒…

P2261 [CQOI2007]余数求和 整除分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,k≤1e9n,k\le1e9n,k≤1e9 思路&#xff1a; 考虑转换式子&#xff0c;∑i1nkmodi∑i1n(k−⌊ki⌋∗i)n∗k−∑i1n⌊ki⌋∗i\sum_{i1}^{n}k\bmod i\sum_{i1}^n(k-\left \lfloor \frac{k}{i} \right \rfloo…

背包问题——第一篇

一&#xff0c;01背包 最简单也是最经典的背包问题。 首先我们知道背包问题是一种d问题&#xff0c;最重要的就是要去找到他的状态转移方程。而在01背包中转移方程就比较简单了&#xff0c;这里用一个二维数组进行标表示。 ans[i][j]max(ans[i-1][j],ans[i-1][j-v[i]w[i]); 在…

小白开学Asp.Net Core 《十》

小白开学Asp.Net Core 《十》 — — Session、Cookie、Cache&#xff08;老生常谈&#xff09;一、背景在常谈Session和Cookie之前我们先来简单的了解下Http&#xff08;可以说这是必须的&#xff0c;默认大家都了解&#xff09;总结一句话&#xff1a;HTTP是一种无状态的协议&…

P3935 Calculating 整除分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们设s(x)∑i1nf(x)s(x)\sum_{i1}^nf(x)s(x)∑i1n​f(x)&#xff0c;那么答案就是s(r)−s(l−1)s(r)-s(l-1)s(r)−s(l−1)。 容易发现&#xff0c;我们要求的f(x)f(x)f(x)实际上就是xxx的…

Sticks-hdu-1455深度搜索dfs

Sticks 题目传送门。 题目大意是&#xff0c;给你一个数字n代表总共的棍子数量&#xff0c;要做的就是&#xff0c;把这几根棍子拼成长度相同的棍子&#xff0c;并且让所拼成的棍子的长度尽可能地小&#xff0c;也就是拼成的棍子的数量尽可能的多。 在这里很简单的想到要给棍…

gRPC in ASP.NET Core 3.0 -- Protocol Buffer(1)

开发环境&#xff1a;IDE: VSCodeVSCode的扩展插件&#xff1a;vscode-proto3和Clang-Format这两个扩展Windows还需要安装Clang&#xff0c;Windows 64位系统的地址如下&#xff1a;Clang for Windows (64-bit)(http://llvm.org/releases/3.7.0/LLVM-3.7.0-win64.exe)&#xff…

[蓝桥杯2016初赛]方格填数

正如题目&#xff0c;我们要保证相邻的数不相连就行了&#xff0c;一共要填十个数。 下面是我的思路&#xff0c;供大家参考一下&#xff0c; 我把上面的各子放进了这个5*6的矩形&#xff0c;其中标记1–10的分别是要填数的各格子&#xff0c;一开始我先初始化这个二维数组为全…

2021牛客暑期多校训练营7 xay loves monotonicity 线段树区间合并

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 题面挺绕口的&#xff0c;还是看原题比较好。 大概的意思就是让你从给定的区间中选择一个以左端点为起点的一个上升子序列&#xff0c;让后将这些下标存下来&#xff0c;在bbb中将这些位置拿出来后&#xff…

容器化单页面应用中Nginx反向代理与Kubernetes部署

在《容器化单页面应用中RESTful API的访问》一文中&#xff0c;我介绍了一个在容器化环境中单页面应用访问后端服务的完整案例。这里我将继续使用这个案例&#xff0c;介绍一下容器化单页面应用部署的另一个场景&#xff1a;将Nginx的职责独立出来。注&#xff1a;这里单页面应…

[蓝桥杯2019初赛]迷宫-DFS、BFS两种方法

迷宫问题的最短路&#xff0c;加最小字典序 迷宫文件maze.txt传送门 作者写的2019年B组蓝桥杯解集 . . . DFS的版本 #include<iostream> #include<cstring> using namespace std; const int ax[4]{0,0,1,-1}; const int ay[4]{1,-1,0,0}; const char dir[5]{R,L…

2021牛客暑期多校训练营7 xay loves trees dfs序 + 主席树

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两棵树&#xff0c;让你在第一棵树选一条最长的深度递增的链&#xff0c;链上每一个点在第二棵树上都不互为祖先。 n≤3e5n\le3e5n≤3e5 思路&#xff1a; 之前做过差不多的题传送门。 之前哪个题是不…

xxl-job dotnet core executor执行器开源

DotXxlJob[(github)https://github.com/xuanye/DotXxlJob][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现&#xff0c;支持XXL-JOB 2.01 XXL-JOB概述[XXL-JOB][1]是一个轻量级分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量…

2019年第十届蓝桥杯 C / C ++省赛 B 组真题题解

A: 组队 输入数据 编号 号位1 2 3 4 51 97 90 0 0 0 2 92 85 96 0 0 3 0 0 0 0 93 4 0 0 0 80 86 5 89 83 97 0 0 6 82 86 0 0 0 7 0 0 0 87 90 8 0 97 96 0 0 9 0 0 89 0 0 10 95 99 0 0 0 11 0 0 96 97 0 12 0 0 0 93 98 13 94 91 0 0 0 14 0 83 87 0 0 15 …

HDU - 7054 Yiwen with Formula 分治拆位FFT + dp + 费马小定理降幂

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求aaa的所有子序列的和的乘积。 思路&#xff1a; 看到suma≤1e5sum_a\le1e5suma​≤1e5&#xff0c;这应该会给我们提示&#xff0c;但是我没看到。 我们可以记cntxcnt_xcntx​表示和为xxx的子序列有cnt…

使用Redis创建分布式锁

点击上方蓝色字关注我们~在本文中&#xff0c;我们将讨论如何在.NET Core中使用Redis创建分布式锁。当我们构建分布式系统时&#xff0c;我们将面临多个进程一起处理共享资源&#xff0c;由于其中只有一个可以一次使用共享资源&#xff0c;因此会导致一些意外问题&#xff01;我…

ASP.NET Core Web Api之JWT VS Session VS Cookie(二)

本文我们来探讨下JWT VS Session的问题&#xff0c;我们可直接抛出问题&#xff1a;使用客户端存储的JWT比服务端维持Session更好吗&#xff1f; 既然要比较JWT VS Session&#xff0c;那我们就得知道为何需要JWT和Session&#xff0c;它们共同是为了解决什么问题呢&#xff1f…

P4721 【模板】分治 FFT

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 写一下式子&#xff0c;发现每个fif_ifi​只有左边的fff对他有影响&#xff0c;所以考虑分治FFTFFTFFT来解决这个问题。 先递归左边&#xff0c;让后计算对右边贡献&#xff0c;再递归右边…

程序员生活之路--来自程序员爸爸的一封信

亲爱的孩子&#xff1a;当你看到爸爸这封信的时候&#xff0c;说明你已经长大了或者已经会玩微信公众号了&#xff0c;当然爸爸还是希望你长大了&#xff0c;并不希望你那么小就天天抱着手机刷微信。我写这个文章的时候正直盛夏&#xff0c;现在外边正是37度的高温&#xff0c;…

C#上位机与欧姆龙PLC的通信05---- HostLink协议

1、介绍 Hostlink协议是欧姆龙PLC与上位机链接的公开协议。上位机通过发送Hostlink命令&#xff0c;可以对PLC进行I/O读写、可以对PLC进行I/O读写、改变操作模式、强制置位/复位等操作。由于是公开协议&#xff0c;即便是非欧姆龙的上位设备&#xff08;软件&#xff09;&…