题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5667

题目意思:f1=1,i=1

     f2=2 ,i=2

     fi=a^b*f[i-1]^c*f[i-2] i>2

思路:发现a^b,和f[i-1]^c之类的东西,我们很明显吧这个幂变成乘,很自然的想到对数。问题是对什么取对数,最后发现对a取对数是合适的。

loga(fi)=loga(a^b*f[i-1]^c*f[i-2])=loga(a^b)+loga(f[i-1]^c)+loga(f[i-2]),我们设k[i]=loga(fi),所以k[i]=b+c*k[i-1]+k[i-2]。我们可以通过矩阵快速幂算出k[n],然后a^k[n]=f[n],可以直接用快速幂算出。

这里注意一下,由于k[n]非常大,所以为了使得a^k[n]%p==(a^(k[n]%y))%p,根据费马小定理如何gcd(a,p)=1,那么 a^(p-1)≡1(mod p),所以a^(p-1)%p=a^0%p,所以循环节为p-1,所以a^(k[n]%(p-1))%p。

这里还有注意一下如果a%p==0,a^(k[n]%(p-1))%p当k[n]=p-1的时候,a^(k[n]%(p-1))%p=1,但是实际上a^(k[n]%(p-1))%p=0,会造成错误,所以需要特判a%p==0的情况,不过这个题好像后台题目有点水,不必判断也能过貌似,所以代码里面没有体现

代码:

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define LL long long
LL p,aa,bb,cc,n,mod; //mod为p-1
struct matrix
{
LL mat[][];
};
matrix pow1(matrix a,matrix b) // N^3的矩阵相乘
{
matrix c;
memset(c.mat,,sizeof(c.mat));
for(int i=;i<;i++){
for(int j=;j<;j++){
for(int k=;k<;k++){
c.mat[i][j] += (a.mat[i][k]*b.mat[k][j]);
c.mat[i][j] %= mod;
}
}
}
return c;
}
matrix cheng(matrix a,LL y) //矩阵快速幂
{
matrix b;
memset(b.mat,,sizeof(b.mat));
for(int i=;i<;i++) b.mat[i][i] = ;
while(y){
if(y&){
b = pow1(a,b);
y-=;
}else {
a = pow1(a,a);
y/=;
}
}
return b;
}
LL quick_pow(LL a,LL tmp) //对a进行快速幂
{
LL b = 1ll;
while(tmp)
{
if(tmp&) b=(a*b)%p;
a=(a*a)%p;
tmp>>=;
}
return b;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%lld%lld%lld%lld%lld",&n,&aa,&bb,&cc,&p);
matrix ma;
mod = p-;
memset(ma.mat,,sizeof(ma.mat));//初始化递归矩阵
ma.mat[][] = cc; ma.mat[][] = ; ma.mat[][] = bb;
ma.mat[][] = ; ma.mat[][] = ; ma = cheng(ma,n-); //算指数和直接幂有点不同
LL tmp = ma.mat[][]*bb + ma.mat[][]; //取出指数
LL ans = quick_pow(aa,tmp);
printf("%lld\n",ans); }
return ;
}

HDU5667—Sequence(对数转化)的更多相关文章

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

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

  2. ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)

    http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...

  3. HDU3666-THE MATRIX PROBLEM(差分约束-不等式解得存在性判断 对数转化)

    You have been given a matrix C N*M, each element E of C N*M is positive and no more than 1000, The p ...

  4. scikit-learn 朴素贝叶斯类库使用小结

    之前在朴素贝叶斯算法原理小结这篇文章中,对朴素贝叶斯分类算法的原理做了一个总结.这里我们就从实战的角度来看朴素贝叶斯类库.重点讲述scikit-learn 朴素贝叶斯类库的使用要点和参数选择. 1. ...

  5. 使用RStudio调试(debug)基础学习(二)和fGarch包中的garchFit函数估计GARCH模型的原理和源码

    一.garchFit函数的参数--------------------------------------------- algorithm a string parameter that deter ...

  6. [机器学习] 分类 --- Naive Bayes(朴素贝叶斯)

    Naive Bayes-朴素贝叶斯 Bayes' theorem(贝叶斯法则) 在概率论和统计学中,Bayes' theorem(贝叶斯法则)根据事件的先验知识描述事件的概率.贝叶斯法则表达式如下所示 ...

  7. 51nod 1673 树有几多愁(链表维护树形DP+状压DP)

    题意 lyk有一棵树,它想给这棵树重标号. 重标号后,这棵树的所有叶子节点的值为它到根的路径上的编号最小的点的编号. 这棵树的烦恼值为所有叶子节点的值的乘积. lyk想让这棵树的烦恼值最大,你只需输出 ...

  8. [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总

    本文出自   http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner  打开 这个专题一共有25题,刷完 ...

  9. NOIP2016 “西湖边超萌小松鼠” 模拟赛

    总的来说,这套题的难度比较接近近些年来Day1的真实难度,认为非常值得一打 GotoAndPlay 题目大意 询问这个图上是否存在一种跳法,能跳到这个图上的每一个点 题目解析 犯了个低级错误,双向边忘 ...

随机推荐

  1. JMeter学习笔记(三)

    D. User Defined Variables:用户自定义的变量,在此我们可以定义后面原件需要引用的变量并对其进行赋值.jsessionid一般是服务器返回的,每个用户返回的都不一样,所以在此不应 ...

  2. eclipse myeclipse 中的server的配置

    (1)本身tomcat的环境配置就是一个很麻烦的事,一不小心,标点错了,少了,根本就起不来. (2)当同一个PC上.装有多个tomcat的话,更是混乱不堪,不仅每个server.xml文件的port号 ...

  3. /^(0|[1-9]\d*)([.]5)?$/ 在PHP正则中是什么意思 ?

    ^以什么开头 ()分组 |或的意思 \d 匹配任何数字字符串 [-] |[-]\d* 或1-9之间的数+任意数字零次或多次 开头 ()分组 []原子表 [.]5匹配. ? 零次或1次 总结: 必须以0 ...

  4. makefile之override

    override指示符 通常在执行 make 时,如果通过命令行定义了一个变量,那么它将替代在 Makefile中出现的同名变量的定义. 就是说,对于一个在 Makefile 中使用常规方式(使用&q ...

  5. 高德地图sdk的AMapNavi.getInstance为null解决办法

    问题,动态库没有全部导入,之前我只放到了armeabi下,可是没想到我手机是armeabi-v7a的. 最近做Android项目,先用的是百度地图,可是后来发现百度地图没有提供地图的View点击事件( ...

  6. STM32F1_常见外设资源汇总

    前言 STM32F1系列芯片算是在STM32中最早的一系列,在实际生活中应用的比较广泛.因此,汇总一下STM32F1系列芯片常见片内资源,每一篇文章把重点提出来讲解,并提供软件源代码工程. 汇总常见资 ...

  7. sqlserver、mysql怎样获取连接字符串

    sqlserver.mysql怎样获取连接字符串 步骤: 一.新建文本文档xxx.txt,改动文件类型为.udl 二.打开该文件,在<提供数据>中找到相应的服务. 三.在连接中选择须要的数 ...

  8. 关于HTML5中hash部分API在历史管理,选项卡自动跳转中的一点使用

    在群里最近有人提到如何处理在页面跳转之后,想要直接定位到相对应的选项卡的选项上,比如首页有登录和注册两个按钮,而登录注册页面有一对选项卡分别对应的是登陆和注册,想要实现的功能是点击登陆去到登录页的登录 ...

  9. could not find com.android.support.appcompat-v7:23.4.0

    导入别人的工程到AS中,出现错误,是由于android studio的版本比所加载的工程所使用的版本低,有些包不是最新的. 我的android studio这个包的版本是 v7:23.1.1 所以需要 ...

  10. MyBatis-Spring-Boot 使用总结

    接 MyBatis-Spring 使用总结 .   mybatis开发团队为Spring Boot 提供了 MyBatis-Spring-Boot-Starter . 首先,MyBatis-Sprin ...