HDU 5667 Sequence(矩阵快速幂)
Problem Description 
    Holion August will eat every thing he has found.
Now there are many foods,but he does not want to eat all of them at once,so he find a sequence.
fn=⎧⎩⎨⎪⎪1,ab,abfcn−1fn−2,n=1n=2otherwise
He gives you 5 numbers n,a,b,c,p,and he will eat fn foods.But there are only p foods,so you should tell him fn mod p.
Input 
    The first line has a number,T,means testcase.
Each testcase has 5 numbers,including n,a,b,c,p in a line.
1≤T≤10,1≤n≤1018,1≤a,b,c≤109,p is a prime number,and p≤109+7.
Output 
    Output one number for each case,which is fn mod p.
Sample Input 
1 
5 3 3 3 233
Sample Output 
190
用矩阵快速幂的时候,注意对p-1取余 
递推式:a[n]=c*a[n-1]+a[n-2]+1;
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long int LL;
struct Node
{
    LL a[3][3];
}A,B,C;
LL p,n,a,b,c;
Node multiply(Node a,Node b)
{
    Node c;
    for(int i=0;i<3;i++)
    {
        for(int j=0;j<3;j++)
        {
            c.a[i][j]=0;
            for(int k=0;k<3;k++)
            {
                (c.a[i][j]+=(a.a[i][k]*b.a[k][j])%(p-1))%=(p-1);
            }
        }
    }
    return c;
}
Node get(Node a,LL x)
{
    Node c;
    for(int i=0;i<3;i++)
        for(int j=0;j<3;j++)
             c.a[i][j]=(i==j?1:0);
    for(x;x;x>>=1)
    {
        if(x&1) c=multiply(c,a);
        a=multiply(a,a);
    }
    return c;
}
LL quick(LL x,LL y)
{
    if(n>1&&y==0) y=p-1;
    LL ans=1;
    for(y;y;y>>=1)
    {
        if(y&1)  ans=(ans*x)%p;
        x=(x*x)%p;
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld%lld%lld%lld%lld",&n,&a,&b,&c,&p);
        A.a[0][0]=0;A.a[1][0]=0;A.a[2][0]=1;
        B.a[0][0]=c; B.a[0][1]=1; B.a[0][2]=1;
        B.a[1][0]=1; B.a[1][1]=0; B.a[1][2]=0;
        B.a[2][0]=0; B.a[2][1]=0; B.a[2][2]=1;
        if(n==1) {cout<<1<<endl;continue;}
        B=get(B,n-1);
        B=multiply(B,A);
        LL num=((B.a[0][0]%(p-1))*(b%(p-1)))%(p-1);
        //cout<<num<<endl;
        cout<<quick(a,num)<<endl;
    }
    return 0;
}HDU 5667 Sequence(矩阵快速幂)的更多相关文章
- HDU 5667 Sequence 矩阵快速幂+费马小定理
		题目不难懂.式子是一个递推式,并且不难发现f[n]都是a的整数次幂.(f[1]=a0;f[2]=ab;f[3]=ab*f[2]c*f[1]...) 我们先只看指数部分,设h[n]. 则 h[1]=0; ... 
- HDU 5667 Sequence 矩阵快速幂
		官方题解: 观察递推式我们可以发现,所有的fi都是a的幂次,所以我们可以对fi取一个以a为底的log,gi=loga fi 那么递推式变gi=b+c∗gi−1+ ... 
- HDU 5667 构造矩阵快速幂
		HDU 5667 构造矩阵快速幂 题目描述 解析 我们根据递推公式 设 则可得到Q的指数关系式 求Q构造矩阵 同时有公式 其中φ为欧拉函数,且当p为质数时有 代码 #include <cstdi ... 
- HDU.2640 Queuing (矩阵快速幂)
		HDU.2640 Queuing (矩阵快速幂) 题意分析 不妨令f为1,m为0,那么题目的意思为,求长度为n的01序列,求其中不含111或者101这样串的个数对M取模的值. 用F(n)表示串长为n的 ... 
- HDU - 1005 Number Sequence 矩阵快速幂
		HDU - 1005 Number Sequence Problem Description A number sequence is defined as follows:f(1) = 1, f(2 ... 
- HDU 5950 - Recursive sequence - [矩阵快速幂加速递推][2016ACM/ICPC亚洲区沈阳站 Problem C]
		题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with ... 
- HDU 1005 Number Sequence(矩阵快速幂,快速幂模板)
		Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ... 
- HDU - 1005 -Number Sequence(矩阵快速幂系数变式)
		A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) m ... 
- E - Recursive sequence HDU - 5950 (矩阵快速幂)
		题目链接:https://vjudge.net/problem/HDU-5950 思路: 构造矩阵,然后利用矩阵快速幂. 1 #include <bits/stdc++.h> 2 #inc ... 
- hdu-5667 Sequence(矩阵快速幂+费马小定理+快速幂)
		题目链接: Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ... 
随机推荐
- atitit.Atitit.  Gui控件and面板-----服务端控件 java struts的实现最佳实践
			atitit.Atitit. Gui控件and面板-----服务端控件 java struts的实现最佳实践 1. 服务器控件的类别 1 1.1. 数据控件:该类控件可细分为两种类型:数据源控件和数 ... 
- Typeface-为自定义字体提供字体内存缓存
			Android 上自定义字体的代码一般如下: TextView textview = (TextView) findViewById(R.id.your_referenced_textview); / ... 
- vue-router介绍
			vue-router学习 转自:https://my.oschina.net/u/1416844/blog/849971 1. vue-router介绍 vue-router把react-router ... 
- echarts报表
			<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ... 
- [vundle]利用vundle工具来管理vim插件
			转自:http://os.51cto.com/art/201507/484174.htm Vim是Linux上一款用途广泛的轻量级文本编辑工具.虽然对普通的Linux用户来说开始学用起来难度相当大,但 ... 
- zend stdio 快捷键
			1.快速跳转到当前所指的函数.变量.方法.类的定义处 F3或者 ctrl+鼠标左键2.ctrl+m 编辑窗口最大化3.ctrl+d 删除当前行4.ctrl+q 定位到最后编辑的地方(全局的)5.ctr ... 
- 错题0913-java
			子类A继承父类B, A a = new A(); 则父类B构造函数.父类B静态代码块.父类B非静态代码块.子类A构造函数.子类A静态代码块.子类A非静态代码块 执行的先后顺序是? A:父类B静态代码块 ... 
- Linux中安装配置spark集群
			一. Spark简介 Spark是一个通用的并行计算框架,由UCBerkeley的AMP实验室开发.Spark基于map reduce 算法模式实现的分布式计算,拥有Hadoop MapReduce所 ... 
- 深入理解Mybatis中sqlSessionFactory机制原理
			对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外.本章将通过以下几点详细介绍MyBatis的初始化过程. 1.MyBatis的初始化做了什么 2. MyBatis基于XML配置 ... 
- web 前端  转盘界面
			http://www.cnblogs.com/arfeizhang/p/turntable.html "如果有个做转盘的需求,你准备怎么做?设计师只会提供一个转盘的图片,其余都需要你完成,不 ... 
