hdu_5667_sequence

来源:互联网 发布:淘宝客买家平台 编辑:程序博客网 时间:2024/06/04 18:25

题目链接:点击打开链接

题目描述:

Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 969    Accepted Submission(s): 310


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,abfcn1fn2,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.

    1T10,1n1018,1a,b,c109,p is a prime number,and p109+7.
 

Output
    Output one number for each case,which is fn mod p.
 

Sample Input
15 3 3 3 233
 

Sample Output
190


n=1n=2otherw

题目大意:现在有一个递推式:f(n)=1,n=1;f(n)=a^b,n=2;f(n) = a^b*(f(n-1))^c*f(n-2).

给出n,求f(n),当时看到这个题目的时候,就开始推导式子,

推导出了这个 g(n)=1+c*g(n-1)+g(n-2),g(n)表示a^b的指数,

想到了用矩阵快速幂,但是不会构造矩阵,看了题解后,觉得真是奇妙;

题解的递推式是 g(n) = b + c*g(n-1) + g(n-2)  ,这个时候的关系式是f(n) = a^g(n)。

然后就可以构造矩阵了,

矩阵A:c  1  b ;  1  0  0;  0  0  1;

矩阵B:g(n-1)  g(n-2) 1;

矩阵C:g(n)  g(n-1)  1;

关系式是C = A *B。这样就可以用快速幂计算f(n)了。

代码:

#include<set>#include<map>#include<list>#include<queue>#include<stack>#include<cmath>#include<vector>#include<cstdio>#include<stdlib.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;#define pb(a) push_back(a)#define mp(a,b) make_pair(a,b)#define in(a) scanf("%d",&a)#define out(a) printf("%d")#define ll long long#define FOR(i,l,r) for(int i=l;i<=r;i++)ll p,n,a,b,c;struct matrix{    ll m[4][4];};matrix mul(matrix &m1,matrix &m2){    matrix ret;    memset(ret.m,0,sizeof(ret.m));    for(int i=0;i<3;i++)        for(int j=0;j<3;j++)          for(int k=0;k<3;k++)    {        ret.m[i][j]+=(m1.m[i][k]*m2.m[k][j])%(p-1);        ret.m[i][j]%=(p-1);    }    return ret;}ll Pow(ll x,ll y){  ll ret=1;  x=x%p;  while(y)  {      if(y&1)ret=ret*x%p;      x=x*x%p;      y=y/2;  }  return ret;}matrix ma_pow(matrix ma,ll x){    matrix ret;    memset(ret.m,0,sizeof(ret.m));    for(int i=0;i<3;i++)        ret.m[i][i]=1;    while(x)    {        if(x&1)ret=mul(ret,ma);          ma=mul(ma,ma);        x=x/2;    }    return ret;}int main(){     int t;     cin>>t;     while(t--)     {         cin>>n>>a>>b>>c>>p;         if(n==1)         {             printf("1\n");             continue;         }         if(n==2)         {             printf("%I64d\n",Pow(a,b));             continue;         }         matrix node;         node.m[0][0]=c,node.m[0][1]=1,node.m[0][2]=b;         node.m[1][0]=1,node.m[1][1]=0,node.m[1][2]=0;         node.m[2][0]=0,node.m[2][1]=0,node.m[2][2]=1;         matrix no;         no=ma_pow(node,n-2);         ll ans=no.m[0][0]*b+no.m[0][2];         ans=Pow(a,ans);         printf("%I64d\n",ans);     }    return 0;}


0 0
原创粉丝点击