现在的位置: 首页 > 综合 > 正文

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

2018年04月12日 ⁄ 综合 ⁄ 共 2237字 ⁄ 字号 评论关闭

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 Xn := αn + βn.

We first note that Xn 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 Xn 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.

抱歉!评论已关闭.