【数论】 快速幂&&矩阵快速幂
首先复习快速幂
#include<bits/stdc++.h>
using namespace std;
long long power(long long a,long long b,long long k)
{
long long ans=,base=a;
while (b>)
{
if(b&)
{
ans*=base;
ans%=k;
}
base*=base;
base%=k;
b>>=;
}
return ans;
}
int main()
{
long long b,p,k;
cin>>b>>p>>k;
cout<<b<<'^'<<p<<" mod "<<k<<"="<<(power(b,p,k) % k);
return ;
}
我居然不DEFINE LL?可以看到上面的码十分好懂
那么矩阵快速幂也是一样的 只不过把*换成了mul函数
用计算机模拟矩阵乘法是这样的
struct mat{
long long m[][];//这里不开ll会死人
};
mat mul(mat x,mat y){
mat r;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
r.m[i][j] = ;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
r.m[i][j] += (x.m[i][k] * y.m[k][j]) % p;
r.m[i][j] %= p;
}
}
}
return r;
}
首先定义一个矩阵并赋初值0 然后模拟乘的过程
什么?你想看矩阵乘法的公式?我不会MARKDOWN啊百度麻烦您了
还有一个小问题 就是在矩阵乘法中 什么矩阵是“1"?
答案就是(1,1)(2,2)(3,3).....(N,N)=1 其他地方为0的矩阵(可以自己手动模拟一下)
好了上完整代码
#include<bits/stdc++.h>
#define ll long long
#define p 1000000007 using namespace std; struct mat{
long long m[][];
}e,ans1,ans2; ll k,n; mat mul(mat x,mat y){
mat r;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
r.m[i][j] = ;
}
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
for(int k=;k<=n;k++){
r.m[i][j] += (x.m[i][k] * y.m[k][j]) % p;
r.m[i][j] %= p;
}
}
}
return r;
} mat pow(mat x,ll y){
mat ans = e;
while (y>){
if(y&){
ans = mul(ans,x);
}
x=mul(x,x);
y>>=;
}
return ans;
} int main(){
cin>>n>>k;
for(int i=;i<=n;i++) e.m[i][i] = ;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
scanf("%d",&ans1.m[i][j]);
}
}
ans2 =pow (ans1,k);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
printf("%d ",ans2.m[i][j]);
}
cout<<endl;
}
return ;
}
你会了这个才会矩阵加速之类乱七八糟的东西
TAG:SIN_XIII ⑨
【数论】 快速幂&&矩阵快速幂的更多相关文章
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 快速幂 & 矩阵快速幂
目录 快速幂 实数快速幂 矩阵快速幂 快速幂 实数快速幂 普通求幂的方法为 O(n) .在一些要求比较严格的题目上很有可能会超时.所以下面来介绍一下快速幂. 快速幂的思想其实是将数分解,即a^b可以分 ...
- jiulianhuan 快速幂--矩阵快速幂
题目信息: 1471: Jiulianhuan 时间限制: 1 Sec 内存限制: 128 MB 提交: 95 解决: 22 题目描述 For each data set in the input ...
- 整数快速乘法/快速幂+矩阵快速幂+Strassen算法
快速幂算法可以说是ACM一类竞赛中必不可少,并且也是非常基础的一类算法,鉴于我一直学的比较零散,所以今天用这个帖子总结一下 快速乘法通常有两类应用:一.整数的运算,计算(a*b) mod c 二.矩 ...
- 快速幂&&矩阵快速幂
快速幂 题目链接:https://www.luogu.org/problemnew/show/P1226 快速幂用了二分的思想,即将\(a^{b}\)的指数b不断分解成二进制的形式,然后相乘累加起来, ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...
- 矩阵快速幂模板(pascal)
洛谷P3390 题目背景 矩阵快速幂 题目描述 给定n*n的矩阵A,求A^k 输入输出格式 输入格式: 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵第i行第j列的元素 输出格 ...
- 培训补坑(day10:双指针扫描+矩阵快速幂)
这是一个神奇的课题,其实我觉得用一个词来形容这个算法挺合适的:暴力. 是啊,就是循环+暴力.没什么难的... 先来看一道裸题. 那么对于这道题,显然我们的暴力算法就是枚举区间的左右端点,然后通过前缀和 ...
随机推荐
- hdu 6287 口算训练
题意: 小Q非常喜欢数学,但是他的口算能力非常弱.因此他找到了小T,给了小T一个长度为nn的正整数序列a1,a2,...,ana1,a2,...,an,要求小T抛出mm个问题以训练他的口算能力. 每个 ...
- python数据科学 学习之路
week1 - Python基础1 介绍.基本语法.流程控制 week1- Python基础2 列表.字典.集合 week1- Python基础3 函数.递归.内置函数 week1- Pyt ...
- 第一个SDL程序
不废话,就WinMain主体: SDL_Window* window = NULL; SDL_Renderer* renderer = NULL; SDL_Event e; bool q = 0; i ...
- Java EE开发技术课程
新的学期开始了,j2e已经上了两节课,接下来就是对该课程的一些作业以及相关的认识: 一.课程目标: Java EE是java的企业级应用,所以在我看来在学习这门课程之前肯定要对java有一个具体的认识 ...
- JDK源码——单例模式
JDK源码中单例模式的应用 1.Runtime类 Runtime类封装了Java运行时的环境.每一个java程序实际上都是启动了一个JVM进程,那么每个JVM进程都是对应这一个Runtime实例,此实 ...
- PAT (Basic Level) Practice (中文)1004 成绩排名 (20 分)
题目链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805321640296448 #include <iost ...
- .NET 常用ORM之NHibernate
NHibernate做.Net应该都不陌生,今天我们就算是温故下这个技术,概念性的东西就不说了,这次主要说本人在实际使用的遇到的问题,比较费解现在就当是记录下,避免以后再犯.本次主要使用的情况是1对N ...
- go语言入门教程:基本语法之数据类型
出处:千锋教育go语言教研部 作者:茹姐 一.基本数据类型 以下是go中可用的基本数据类型 1.1 布尔型bool 布尔型的值只可以是常量 true 或者 false.一个简单的例子:var b bo ...
- sublime 使用链接
链接 :http://www.cnblogs.com/gaosheng-221/p/6108033.html https://www.zhihu.com/question/24896283 http ...
- radhat6.6上安装oracle12c RAC (一)
软件环境:VMware.redhat6.6.oracle12c(linuxx64_12201_database.zip).12cgrid(linuxx64_12201_grid_home.zip) 一 ...