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

题意:如题给了一个函数式,给你a,b,c,n,p的值,叫你求f(n)%p的值

思路:先对函数取以a为底的log,令g(n)=log(a)(f(n)),结果就能得到

g(n)=b+c*g(n-1)+g(n-2);(n>3)

g(n)=0;(n=1)

g(n)=b;(n=2)

          g(n)    c  1  1    g(n-1)

用矩阵表示出来就是 g(n-1) = 1  0  0    *  g(n-2)

             b    0  0 1    b

设中间的矩阵为A 那么要求g(n)就是用A^(n-2)*g(2)来求得

                      g(1)  

                        b

而我们要求的是 f(n)%p,f(n)=a^g(n),很明显g(n)是会爆的,那么因为p是质数,所以f(n)%p=(a^(g(n)%(p-1))%p

用快速幂一样的思路来模拟矩阵的乘法就行了

矩阵的乘法三个for循环就能写掉

for(int i=1;i<=n;i++)

  for(int j=1;j<=n;j++)

    for(int k=1;k<=n;k++)

      tmp[i][j]=(tmp[i][j]+a[i][k]*b[k][j]);

然后设置三个矩阵,一个初始化为单位矩阵用来存储答案,一个存储当前的值,一个用来计算。

之后求出了g(n)的值之后,对原式还是要做一次快速幂,注意特判a%p==0的情况,0^0=1不处理

 #include <stdio.h>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;
long long x[][];
long long y[][];
long long t;
long long n,a,b,c,p;
long long qpow1(long long a1,long long n1 )
{
long long ans=;
while(n1)
{
if(n1&)
ans=ans*a1%p;
a1=a1*a1%p;
n1>>=;
}
return ans;
}
void qpow(long long n1)
{
long long tmp[][];
memset(x,,sizeof(x));
for(int i=;i<;i++)
x[i][i]=; while(n1)
{
memset(tmp,,sizeof(tmp));
if(n1&)
{
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
for(int k=;k<;k++)
{
tmp[i][j]=(tmp[i][j]+x[i][k]*y[k][j]) % (p-);
}
}
}
for(int i=;i<;i++)
for(int j=;j<;j++)
x[i][j]=tmp[i][j];
}
memset(tmp,,sizeof(tmp));
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
for(int k=;k<;k++)
{
tmp[i][j]=(tmp[i][j]+y[i][k]*y[k][j]) % (p-);
}
}
}
for(int i=;i<;i++)
for(int j=;j<;j++)
y[i][j]=tmp[i][j];
n1>>=;
}
}
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld %lld %lld %lld %lld",&n,&a,&b,&c,&p);
if(a%p==)
{
printf("0\n");
continue;
}
memset(y,,sizeof(y));
y[][]=c,y[][]=,y[][]=;
y[][]=,y[][]=,y[][]=;
y[][]=,y[][]=,y[][]=;
qpow(n-);
long long ans1=(x[][]*b+b*x[][])%(p-);
printf("%lld\n",qpow1(a,ans1));
}
return ;
}

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

  1. bzoj5118: Fib数列2(费马小定理+矩阵快速幂)

    题目大意:求$fib(2^n)$ 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h& ...

  2. HDU 4549 (费马小定理+矩阵快速幂+二分快速幂)

    M斐波那契数列 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  3. 【费马小定理+矩阵快速幂】HDU4549——M斐波那契数列

    [题目大意] M斐波那契数列F[n]是一种整数数列,它的定义如下:F[0] = aF[1] = bF[n] = F[n-1] * F[n-2] ( n > 1 )现在给出a, b, n,求出F[ ...

  4. HDOJ 4549 M斐波那契数列 费马小定理+矩阵高速幂

    MF( i ) = a ^ fib( i-1 ) * b ^ fib ( i )   ( i>=3) mod 1000000007 是质数 , 依据费马小定理  a^phi( p ) = 1 ( ...

  5. hdu4704之费马小定理+整数快速幂

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  6. hdu 4704 Sum(组合,费马小定理,快速幂)

    题目链接http://acm.hdu.edu.cn/showproblem.php?pid=4704: 这个题很刁是不是,一点都不6,为什么数据范围要开这么大,把我吓哭了,我kao......说笑的, ...

  7. ACM-ICPC 2018 焦作赛区网络预赛- G:Give Candies(费马小定理,快速幂)

    There are N children in kindergarten. Miss Li bought them NNN candies. To make the process more inte ...

  8. 【bzoj5118】Fib数列2 费马小定理+矩阵乘法

    题目描述 Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2) 现给出N,求Fib(2^n). 输入 本题有多组数据.第一行一个整数T,表示数据 ...

  9. Fib数列2 费马小定理+矩阵乘法

    题解: 费马小定理 a^(p-1)=1(mod p) 这里推广到矩阵也是成立的 所以我们可以对(2^n)%(p-1) 然后矩阵乘法维护就好了 模数较大使用快速乘

随机推荐

  1. D - Nature Reserve(cf514,div2)

    题意:给出n(n<=1e5)个点,求一个最小的圆,与x轴相切,并且包含这n个点 思路:我第一想到的是,这个圆一定会经过一个点,再根据与x轴相切,我们可以找到最小的圆,让它包含其余的点,但是如何判 ...

  2. poj2104 主席树裸题

    空间大小:n*lgn 复杂度:建树n*lgn  查询lgn #include <cstdio> #include <iostream> #include <algorit ...

  3. javaweb之Cookie学习

    Cookie简介 HTTP是无状态协议,服务器不能记录浏览器的访问状态,也就是说服务器不能区分中两次请求是否由一个客户端发出.这样的设计严重阻碍的Web程序的设计.如:在我们进行网购时,买了一条裤子, ...

  4. java总结:Java中获取系统时间(年、月、日)以及下拉菜单默认选择系统年、月、日的方法

    <!-- 获取系统当前的年.月.日 --> <%@ page import="java.util.*"%> <% Calendar calendar= ...

  5. 使用node操作mongodb

    let mongodb = require('mongodb'); let MongodbClient = mongodb.MongoClient; MongodbClient.connect('mo ...

  6. win10查看无线密码

  7. C++中String类的字符串分割实现

    最近笔试,经常遇到需要对字符串进行快速分割的情景,主要是在处理输入的时候,而以前练习算法题或笔试,很多时候不用花啥时间考虑测试用例输入的问题.可是C++标准库里面没有像java的String类中提供的 ...

  8. SCP传送文件时提示No ECDSA host key is known forx.x.x.x and you have requested strict checking.问题的解决办法

    在使用SCP向其他设备传送文件时,打印如下错误: No ECDSA host key is known for x.x.x.x and you have requested strict checki ...

  9. netstat -na 查看有大量TIME_WAIT解决办法(修改内核参数)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c      16 CLOSING     130 ESTABLISHED     298 FIN_WA ...

  10. python数据结构与算法第四天【代码执行时间测试模块】

    #!/usr/bin/env python # _*_ coding:UTF-8 _*_ from timeit import Timer def foo(): ''' 使用append方式向列表添加 ...