首页 > 代码库 > hdu So Easy!

hdu So Easy!

So Easy!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2026    Accepted Submission(s): 624


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 2013
2 3 2 2013
2 2 1 2013
 

 

Sample Output
4
14
4
 

 

Source
2013 ACM-ICPC长沙赛区全国邀请赛——题目重现

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 typedef __int64 LL;
 7 
 8 LL  p ;
 9 struct Matrix
10 {
11     LL mat[3][3];
12     void init()
13     {
14         mat[1][1]=1;mat[1][2]=0;
15         mat[2][1]=0;mat[2][2]=1;
16     }
17     void mem(LL a,LL b)
18     {
19         mat[1][1]=(2*a)%p; mat[1][2]=(b-a*a)%p;
20         mat[2][1]=1;     mat[2][2]=0;
21     }
22 };
23 Matrix multiply(Matrix cur,Matrix ans)
24 {
25     Matrix now;
26     memset(now.mat,0,sizeof(now.mat));
27     int i,j,k;
28     for(i=1;i<=2;i++)
29     {
30         for(k=1;k<=2;k++)
31         {
32             for(j=1;j<=2;j++)
33             {
34                 now.mat[i][j]+=cur.mat[i][k]*ans.mat[k][j];
35                 now.mat[i][j]%=p;
36                 while(now.mat[i][j]<0) now.mat[i][j]+=p;
37             }
38         }
39     }
40     return now;
41 }
42 void pow_mod(Matrix cur,LL n,LL a,LL b)
43 {
44     Matrix ans;
45     ans.init();
46     while(n)
47     {
48         if(n&1) ans=multiply(ans,cur);
49         n=n>>1;
50         cur=multiply(cur,cur);
51     }
52     LL sum=(ans.mat[1][1]*2*a+ans.mat[1][2]*2)%p;
53     printf("%I64d\n",sum);
54 }
55 int main()
56 {
57     LL a,b,n;
58     while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&n,&p)>0)
59     {
60         Matrix hxl;
61         hxl.mem(a,b);
62         if(n>1)
63         pow_mod(hxl,n-1,a,b);
64         else printf("%I64d\n",(2*a)%p);
65     }
66     return 0;
67 }