【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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值