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, T. T 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: Ywhere 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
本题意思是 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.
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.