前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >矩阵快速幂

矩阵快速幂

作者头像
luxuantao
发布2021-02-24 11:21:24
2420
发布2021-02-24 11:21:24
举报
文章被收录于专栏:Fdu弟中弟Fdu弟中弟

之前了解的快速幂是针对一个数的,原来矩阵也有快速幂!

原题连接 :CSU - 1597

Description

薛XX的低IQ是个令人头疼的问题,他的队友深受其害。幸运的是,薛XX非常有钱,所以他买了一些可以提高他的后代的IQ的药。这种药有三个属性,A,B和P。当薛XX使用这种药的时候,他的基因会发生变化,所以他的儿子的IQ也会跟着变化。假设薛XX的父亲的IQ为X,薛XX自己的IQ为Y,那么薛XX的儿子的IQ为(AX+BY) mod P。薛XX的孙子的IQ依次类推。 现在给定X和Y,还有药的属性A、B和P,现在他想知道他的N代子孙的IQ(儿子是第一代,孙子是第二代)。

Input

第一行包含一个整数T(T<=100),表示数据组数 每组数据只有一行,包含六个整数X,Y,A,B,P,N(1 ≤ X, Y ≤ 300,1 ≤ A, B ≤ 30, 1≤ P ≤ 300 , 1 ≤ N < 1000000000),含义如题目所述

Output

对于每组数据,输出答案

Sample Input

代码语言:javascript
复制
4
180 80 1 1 190 1
189 83 2 2 190 1
189 83 1 1 190 2 
172 73 23 19 273 9999

Sample Output

代码语言:javascript
复制
70
164
165
233

转自题解链接:http://www.cnblogs.com/PrimeXuan/p/5521079.html

代码如下:

代码语言:javascript
复制
#include<iostream>
#include<cstdio>
#include<cstring>

using namespace std;

typedef long long ll;
const int maxn=2;
int a,x,b,y,c,mod;
ll n;

struct Matrix
{
    int a[maxn][maxn];
    Matrix(){memset(a,0,sizeof(a));}
    Matrix operator* (const Matrix &p)
    {
        Matrix res;
        for(int i=0;i<maxn;i++)
        {
            for(int j=0;j<maxn;j++)
            {
                for(int k=0;k<maxn;k++)
                {
                    res.a[i][j]+=(a[i][k]*p.a[k][j]%mod);
                }
                res.a[i][j]%=mod;
            }
        }
        return res;
    }
}ans,base;

Matrix quick_pow(Matrix base,ll n)
{
    Matrix res;
    for(int i=0;i<maxn;i++)
    {
        res.a[i][i]=1;
    }
    while(n)
    {
        if(n&1) res=res*base;
        base=base*base;
        n>>=1;
    }
    return res;
}

void init_matrix()
{
    ans.a[0][0]=y;
    ans.a[0][1]=x;
    ans.a[1][0]=0;
    ans.a[1][1]=0;
    base.a[0][0]=b;
    base.a[0][1]=1;
    base.a[1][0]=a;
    base.a[1][1]=0;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d%d%I64d",&x,&y,&a,&b,&mod,&n);
        init_matrix();
        ans=ans*quick_pow(base,n);
        printf("%d\n",ans.a[0][0]);
    }
    return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档