题目不难懂。式子是一个递推式,并且不难发现f[n]都是a的整数次幂。(f[1]=a0;f[2]=ab;f[3]=ab*f[2]c*f[1]...)

我们先只看指数部分,设h[n]. 则

h[1]=0;

h[2]=b;

h[3]=b+h[2]*c+h[1];

h[n]=b+h[n-1]*c+h[n-1].

h[n]式三个数之和的递推式,所以就可以转化为3x3的矩阵与3x1的矩阵相乘。于是

h[n]       c  1  b    h[n-1]

h[n-1]  =  1  0  0  *  h[n-2] 

1           0  0  1       1

又根据费马小定理(ap-1%p=1,p是质数且a,p互质)可得:ah[n]%mod=ah[n]%(mod-1)%mod.

因为 ah[n]%mod= ax*(mod-1)+h[n]%(mod-1)%mod = ax*(mod-1)*ah[n]%(mod-1)%mod = ah[n]%(mod-1)%mod;

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; typedef long long ll;
ll p;
struct Mat
{
ll mat[][];
};
Mat Multiply(Mat a, Mat b)
{
Mat c;
memset(c.mat, , sizeof(c.mat));
for(int k = ; k < ; ++k)
for(int i = ; i < ; ++i)
if(a.mat[i][k])
for(int j = ; j < ; ++j)
if(b.mat[k][j])
c.mat[i][j] = (c.mat[i][j] +a.mat[i][k] * b.mat[k][j])%(p-);
return c;
}
Mat QuickPower(Mat a, ll k)
{
Mat c;
memset(c.mat,,sizeof(c.mat));
for(int i = ; i <; ++i)
c.mat[i][i]=;
for(; k; k >>= )
{
if(k&) c = Multiply(c,a);
a = Multiply(a,a);
}
return c;
}
ll Powermod(ll a,ll b)
{
a%=p;
ll ans=;
for(; b; b>>=)
{
if(b&) ans=(ans*a)%p;
a=(a*a)%p;
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
ll n,a,b,c;
Mat x;
while(T--)
{
scanf("%I64d%I64d%I64d%I64d%I64d",&n,&a,&b,&c,&p);
if(n==)
printf("1\n");
else if(n==)
printf("%I64d\n",Powermod(a,b));
else
{
x.mat[][]=c; x.mat[][]=; x.mat[][]=b;
x.mat[][]=; x.mat[][]=; x.mat[][]=;
x.mat[][]=; x.mat[][]=; x.mat[][]=;
x=QuickPower(x,n-);
ll k=(x.mat[][]*b+x.mat[][]);
printf("%I64d\n",Powermod(a,k));
}
}
return ;
}

HDU 5667 Sequence 矩阵快速幂+费马小定理的更多相关文章

  1. hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)

    题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Others) ...

  2. HDU——5667Sequence(矩阵快速幂+费马小定理应用)

    Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S ...

  3. HDU 5667 Sequence【矩阵快速幂+费马小定理】

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5667 题意: Lcomyn 是个很厉害的选手,除了喜欢写17kb+的代码题,偶尔还会写数学题.他找到 ...

  4. hdu 4549 M斐波那契数列(快速幂 矩阵快速幂 费马小定理)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4549: 题目是中文的很容易理解吧.可一开始我把题目看错了,这毛病哈哈. 一开始我看错题时,就用了一个快速 ...

  5. hdu 4549 M斐波拉契 (矩阵快速幂 + 费马小定理)

    Problem DescriptionM斐波那契数列F[n]是一种整数数列,它的定义如下: F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 ) 现在 ...

  6. HDU 4549 M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submi ...

  7. M斐波那契数列(矩阵快速幂+费马小定理)

    M斐波那契数列 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Sub ...

  8. hdu4549矩阵快速幂+费马小定理

    转移矩阵很容易求就是|0  1|,第一项是|0| |1  1|             |1| 然后直接矩阵快速幂,要用到费马小定理 :假如p是质数,且gcd(a,p)=1,那么 a(p-1)≡1(m ...

  9. 2020牛客寒假算法基础集训营1 J. 缪斯的影响力 (矩阵快速幂/费马小定理降幂)

    https://ac.nowcoder.com/acm/problem/200658 f(n) = f(n-1) * f(n-2) * ab ,f的第一项是x,第二项是y. 试着推出第三项是x·y·a ...

随机推荐

  1. ubuntu下 mysql5.6.4 +sphinx安装

    安装mysql 5.6.4 下载源码 安装cmake sudo apt-get install cmake 进入mysql源码包: 创建mysql用户与用户组 groupadd mysql usera ...

  2. Twig模版语言入门

    转自 :http://pengbotao.cn/twig-template-language.html Twig中有两种定界符{% ... %} 和 {{ ... }} , 前一种用来执行语句,比如f ...

  3. 基于Maven构建整合SpringMVC+Mybtis+Druid

    前几天趁空闲时间整合了下SpringMVC+Mybatis+Druid,这里小记录下,这个Demo是基于Maven构建的,数据源用的是阿里巴巴温少的开源项目Druid,数据库用的是Mysql. 由于E ...

  4. ext 3.x 让uploadPanel支持swfupload

    经常做系统的时候会遇到上传组件,特别是大文件的时候总是很郁闷,长时间无响应导致糟糕的用户体验,所以决定采用swfupload来支持文件上传. 大体代码如下. var upload = {}; uplo ...

  5. ES6转ES5:Gulp+Babel

    目标: ES6代码转成ES5 对转换后的ES5进行压缩 以上步骤自动监控执行 步骤: 1.安装插件 在命令行中定位到项目根目录 安装全局 Gulp npm install -g gulp 安装项目中使 ...

  6. SNF开发平台WinForm之十-Excel导入-SNF快速开发平台3.3-Spring.Net.Framework

    7.1运行效果: 2.Excel导入开发实现 2.1. 创建窗体,修改命名空间 新增的窗体命名“FrmImport表名”,这个导入窗口比较其它窗口会特殊一些,需要继承BaseFormImport父级窗 ...

  7. maven中文乱码问题——打包错误

    工程采用GBK编码, web应用中的配置文件打包后,war包里的配置文件里的中文成乱码.   用notepad++打开后,可以看到是用utf-8格式的(可以通过菜单中的[格式]查看),也就是说,在经过 ...

  8. MVC 4 中编译时,让View 也弹出异常

    前言 MVC在编译时,不会提示View中的错误,我们在发布项目的时候会一个一个的提示异常,项目大的时候会非常头疼,因为每次发布都需要至少5分钟,最后收到只有一个异常信息,如果页面异常过多,例如最近整理 ...

  9. bower的使用

    一.bower的安装 安装nodejs的最新版本: 安装npm. 由于npm是nodejs的包管理器,所以在将nodejs安装完成后,npm也就自动安装完成. 安装git. 安装bower. 使用 n ...

  10. 受限玻尔兹曼机(RBM)学习笔记(三)能量函数和概率分布

      去年 6 月份写的博文<Yusuke Sugomori 的 C 语言 Deep Learning 程序解读>是囫囵吞枣地读完一个关于 DBN 算法的开源代码后的笔记,当时对其中涉及的算 ...