HDU 4565 So Easy!

来源:互联网 发布:淘宝客服的自我介绍 编辑:程序博客网 时间:2024/05/17 20:31

Problem Description

  A sequence Sn is defined as:

Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example, ┌3.14┐=4. You are to calculate Sn.
  You, a top coder, say: So easy! 

Input

  There are several test cases, each test case in one line contains four positive integers: a, b, n, m. Where 0< a, m < 215, (a-1)2< b < a2, 0 < b, n < 231.The input will finish with the end of file.

Output

  For each the case, output an integer Sn.

Sample Input

2 3 1 20132 3 2 20132 2 1 2013

Sample Output

414

4

关键是找到递推式

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;typedef long long use;use n,m,a,b,x[2][3],y[2][3],c[3][3],e[3][3],d[3][3];int main(){    while (cin>>a>>b>>n>>m)    {        x[1][1]=(a+a)%m;    x[1][2]=(2*a*a+2*b)%m;        memset(y,0,sizeof(y));        c[1][1]=0;    c[1][2]=(m+(b-a*a)%m)%m;        c[2][1]=1;    c[2][2]=(a+a)%m;        e[1][1]=e[2][2]=1;        e[1][2]=e[2][1]=0;        for (int u=n-1;u;u>>=1)        {            if (u&1)             {                memset(d,0,sizeof(d));                for (int i=1;i<3;i++)                    for (int j=1;j<3;j++)                        for (int k=1;k<3;k++)                            (d[i][k]+=c[i][j]*e[j][k])%=m;                memcpy(e,d,sizeof(d));            };            memset(d,0,sizeof(d));            for (int i=1;i<3;i++)                    for (int j=1;j<3;j++)                        for (int k=1;k<3;k++)                            (d[i][k]+=c[i][j]*c[j][k])%=m;            memcpy(c,d,sizeof(d));        }        for (int i=1;i<2;i++)            for (int j=1;j<3;j++)                for (int k=1;k<3;k++)                    (y[i][k]+=x[i][j]*e[j][k])%=m;        cout<<y[1][1]<<endl;    }    return 0;}


0 0
原创粉丝点击