转载:http://www.klogk.com/posts/hdu4565/
这里写的非常好,看看就知道了啊。
题意很easy。
这个题目也是2008年Google Codejam Round 1A的C题。
做法事实上很easy。记
两项恰好共轭,所以
又依据限制条件
也就是说
求
于是
把这个递推式写成矩阵形式
于是就能够用矩阵高速幂来做了
So Easy!
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2286 Accepted Submission(s): 710
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!


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
<span style="font-size:18px;">#include <algorithm> #include <iostream> #include <stdlib.h> #include <string.h> #include <iomanip> #include <stdio.h> #include <string> #include <queue> #include <cmath> #include <stack> #include <map> #include <set> #define eps 1e-10 ///#define M 1000100 #define LL __int64 ///#define LL long long ///#define INF 0x7ffffff #define INF 0x3f3f3f3f #define PI 3.1415926535898 #define zero(x) ((fabs(x)<eps)?0:x) ///#define mod 10007 const int maxn = 210; using namespace std; struct matrix { LL f[3][3]; }; LL mod; matrix mul(matrix a, matrix b, int n) { matrix c; memset(c.f, 0, sizeof(c.f)); for(int k = 0;k < n; k++) { for(int i = 0; i < n;i++) { if(!a.f[i][k]) continue; for(int j = 0; j < n; j++) { if(!b.f[k][j]) continue; c.f[i][j]=(c.f[i][j]+a.f[i][k]*b.f[k][j]+mod)%mod; } } } return c; } matrix pow_mod(matrix a, LL b, int n) { matrix s; memset(s.f, 0 , sizeof(s.f)); for(int i = 0; i < n; i++) s.f[i][i] = 1LL; while(b) { if(b&1) s = mul(s, a, n); a = mul(a, a, n); b >>= 1; } return s; } int main() { LL a, b, n; while(~scanf("%I64d %I64d %I64d %I64d",&a, &b, &n, &mod)) { if(n == 1) { printf("%I64d ",2*a%mod); continue; } matrix c; memset(c.f, 0 , sizeof(c.f)); c.f[0][0] = 2LL*a; c.f[0][1] = b-a*a; c.f[1][0] = 1LL; matrix d = pow_mod(c, n-1, 2); printf("%I64d ",((d.f[0][0]*2*a+d.f[0][1]*2)%mod+mod)%mod); } return 0; }</span>