【gcj 2008 1b】numbers: 复数的次方取整+矩阵加速

1 numbers 

参照 http://www.cppblog.com/baby-fly/archive/2009/08/28/94622.html

Problem

In this problem, you have to find the last three digits before the decimal point for the number (3 + √5)n.

For example, when n = 5, (3 + √5)5 = 3935.73982... The answer is 935.

For n = 2, (3 + √5)2 = 27.4164079... The answer is 027.

Input

The first line of input gives the number of cases, TT test cases follow, each on a separate line. Each test case contains one positive integer n.

Output

For each input case, you should output:

Case #X: Y
where  X  is the number of the test case and  Y  is the last three integer digits of the number (3 + √5) n . In case that number has fewer than three integer digits, add leading zeros so that your output contains exactly three digits.

Limits

1 <= T <= 100

Small dataset

2 <= n <= 30

Large dataset

2 <= n <= 2000000000

Sample


Input 
 

Output 
 
2
5
2
Case #1: 935
Case #2: 027


本题意思是 a=3 + √5, a^n的整数部分%1000等于多少呢?

首先很容易想到 yn=a^n, 有y0=1,y1=3+√5,yn=6*y(n-1)-4y(n-2).

那么[y0,y1]*

   [ 0  -4] ^n  = [yn, y(n+1)]

   [ 1  6]

问题在于 y0*an+y1*bn=yn, 化简后 yn=cn+dn*√5 .后面的dn*√5 %1000又等于多少呢?

显然这样做行不通。


换一种思路, yn=a^n=(3+√5)^n, zn=b^n=(3-√5)^n.可以知道这两个数是一对共e复数的n次方。

a+b=6, a>1,b<1,  并且zn=b^n<1

yn+zn= E(c(n,k)*3^k*5^(n-k)) + E( c(n,k)*3^k*(-√5)^(n-k)) = 

2*E(c(n,n-2j)*3^(n-2j)*√5^(2j) )=2*E(c(n,n-2j)*3^(n-2j)*5^j ) ,

可以看出yn+zn是一个整数!!

显然zn<1,那么yn=(yn+zn)-zn就是小于这个整数的某个小数! 则yn %1000 = (yn+zn) %1000 -1  !!!

于是现在题目变成了求tn=yn+zn! 

y0+z0=2, y1+z1=6, tn=yn+zn=6y(n-1)-4y(n-2) + 6z(n-1))-4z(n-2)=6t(n-1)-4t(n-2).


Analysis

Solving the large tests was a very different problem. The difficulty comes from the fact that √5 is irrational and for n close to 2000000000 you would need a lot of precision and a lot of time if you wanted to use the naive solution.

The key in solving the problem is a mathematical concept called conjugation. In our problem, we simply note that  (3 - √5)  is a nice conjugate for  (3 + √5) . Let us define

(1)     α := 3 + √5,   β := 3 - √5,   and X n := α n + β n.
We first note that X n is an integer. This can be proved by using the  binomial expansion. If you write everything down you'll notice that the irrational terms of the sums cancel each other out.

Another observation is that β n < 1, so X n is actually the first integer greater than α n. Thus we may just focus on computing the last three digits of X

A side note. In fact, βn tends to 0 so quickly that that our problem would be trivial if we asked for the three digits after the decimal point. For all large values of n they are always 999.


SO, the last three digits of Xn-1 is what we want. We also know that X (n)=6X(n-1)-4X(n-2),X(0)=2,X(1)=6,so we can calc Xn easily.

你可能感兴趣的:(【gcj 2008 1b】numbers: 复数的次方取整+矩阵加速)