青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Google code jam 2008 R1A - Numbers

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: 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


Analysis

This problem with a simple statement was in fact one of the hardest in Round 1. The input restrictions for the small input were chosen so that straightforward solutions in Java or Python, which have arbitrary-precision numbers, would fail. The trick was calculating √5 to a large enough precision and not using the default double value. It turned out that using the Windows calculator or the UNIX bc tool was enough to solve the small tests as well.

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.
(2)    
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.

Based on (1) and (2), there are many different solutions for finding the last three digits of Xn.

Solution A. [the interleave of rational and irrational]

One solution goes like this: αn can be written as (an + bn√5), where an and bn are integers. At the same time, βn is exactly (an - bn√5) and Xn = 2an. Observe that

(3)     α(n + 1) = (3 + √5)(an + bn√5) = (3an + 5bn) + (3bn + an)√5.
So an + 1 = 3an + 5bn and bn + 1 = 3bn + an. This can be written in matrix form as
(4)    
Since α0 = 1, we have (a0, b0) = (1, 0).

 

Now we use the standard fast exponentiation to get An in O(log n) time. Note that we do all operations modulo 1000 because we just need to return the last three digits of an.

Here's some Python code that implements this solution:

def matrix_mult(A, B):
C = [[0, 0], [0, 0]]
for i in range(2):
for j in range(2):
for k in range(2):
C[i][k] = (C[i][k] + A[i][j] * B[j][k]) % 1000
return C
def fast_exponentiation(A, n):
if n == 1:
return A
else:
if n % 2 == 0:
A1 = fast_exponentiation(A, n/2)
return matrix_mult(A1, A1)
else:
return matrix_mult(A, fast_exponentiation(A, n - 1))
def solve(n):
A = [[3, 5], [1, 3]]
A_n = fast_exponentiation(A, n)
return (2 * M_n[0][0] + 999) % 1000

 

Solution B. [the quadratic equation and linear recurrence]

Experienced contestants may notice there is a linear recurrence on the Xi's. Indeed, this is not hard to find -- the conjugation enters the picture again.

Notice that

(5)     α + β = 6, and α β = 4.
So α and β are the two roots of the quadratic equation x2 - 6x + 4 = 0. i.e.,
(6)     α2 = 6α - 4, and β2 = 6β - 4.
Looking at (1) and (6) together, we happily get
(7)     Xn+2 = 6Xn+1 - 4Xn.
Such recurrence can always be written in matrix form. It is somewhat redundant, but it is useful:
From here it is another fast matrix exponentiation. Let us see radeye's perl code that implements this approach here:
sub mul {
my $a = shift ;
my $b = shift ;
my @a = @{$a} ;
my @b = @{$b} ;
my @c = ($a[0]*$b[0] + $a[1]*$b[2],
$a[0]*$b[1] + $a[1]*$b[3],
$a[2]*$b[0] + $a[3]*$b[2],
$a[2]*$b[1] + $a[3]*$b[3]) ;
@c = map { $_ % 1000 } @c ;
return @c ;
}
sub f {
my $n = shift ;
return 2 if $n == 0 ;
return 6 if $n == 1 ;
return 28 if $n == 2 ;
$n -= 2 ;
my @mat = (0, 1, 996, 6) ;
my @smat = @mat ;
while ($n > 0) {
if ($n & 1) {
@mat = mul([@mat], [@smat]) ;
}
@smat = mul([@smat], [@smat]) ;
$n >>= 1 ;
}
return ($mat[0] * 6 + $mat[1] * 28) % 1000 ;
}
sub ff {
my $r = shift ;
$r = ($r + 999) % 1000 ;
$r = "0" . $r while length($r) < 3 ;
return $r ;
}
for $c (1..<>) {
$n = <> ;
print "Case #$c: ", ff(f($n)), "\n" ;
}

 

Solution C. [the periodicity of 3 digits]

For this problem, we have another approach based on the recurrence (7). Notice that we only need to focus on the last 3 digits of Xn, which only depends on the last 3 digits of the previous two terms. The numbers eventually become periodic as soon as we have (Xi, Xi+1) and (Xj, Xj+1) with the same last 3 digits, where i < j. It is clear that we will enter a cycle no later than 106 steps. In fact, for this problem, you can write some code and find out that the cycle has the size 100 and starts at the 3rd element in the sequence. So to solve the problem we can just brute force the results for the first 103 numbers and if n is bigger than 103 return the result computed for the number (n - 3) % 100 + 3.

Solution D. [the pure quest of numbers and combinatorics]

Let us see one more solution of different flavor. Here is a solution not as general as the others, but tailored to this problem, and makes one feel we are almost solving this problem by hand.

Let us look again at (2). We want to know Xn mod 1000. We know from the chinese remander theorem that if we can find Xn mod 8 and Xn mod 125, then Xn mod 1000 is uniquely determined.
(a) For n > 2, Xn mod 8 is always 0. Since 5i ≡ 1 (mod 4), 3n-2i ≡ 1 or -1 (mod 4) depending on n, so, for n > 2,
(b) To compute Xn mod 125, we only need to worry about i=0,1,2. All the rest are 0 mod 125. In other words, all we need to compute is
There are various ways to compute the elements in the above quantity. The exponents can be computed by fast exponentiation, or using the fact that 3n mod 125 is periodic with cycle length at most 124. The binomial numbers can be computed using arbitrary precision integers in languages like Java and Python, or with a bit careful programming in languages like C++.

 

Afterword

There were many other interesting solutions submitted by the contestants, and Nathan Collins actually went through many of them and tried to summarize them in his awesome blog post.

More information:

Binomial numbers - Linear recurrence - Exponentiation - Chinese remainder theorem


Source Code
#include <iostream>

using namespace std;

#define Rep(i,n) for (int i(0),_n(n); i<_n; ++i)

int* matrix_mult(int* A, int* B, int* ret) {
    Rep(i,
2{
        Rep(j,
2{
            Rep(k,
2{
                ret[i
*2+k] = (ret[i*2+k] + A[i*2+j] * B[j*2+k]) % 1000;
            }

        }

    }

    
return ret;
}


int* fast_exponentiation(int* A, int n, int* A1) {
    
if (n == 1{
        Rep(i,
4{
            A1[i] 
= A[i];
        }

        
return A1;
    }

    
else if (n % 2 == 0{
        
int A_tmp[] = {0,0,0,0};
        fast_exponentiation(A, n
/2, A_tmp);
        matrix_mult(A_tmp, A_tmp, A1);
        
return A1;
    }

    
else {
        
int A_tmp[] = {0,0,0,0};
        fast_exponentiation(A, n 
- 1, A_tmp);
        matrix_mult(A, A_tmp, A1);
        
return A1;
    }

}


int solve(int n) {
    
int A[] = {3513};
    
int ret[] = {0,0,0,0};
    fast_exponentiation(A, n, ret);
    
return (2 * ret[0+ 999% 1000;
}



int main()
{
    
int T;
    scanf(
"%d"&T);
    Rep(t, T) 
{
        
int n;
        scanf(
"%d"&n);
        
int ret = solve(n);
        
        printf(
"Case #%d: %03d\n", t+1, ret);
    }

}

posted on 2009-08-12 18:35 Chauncey 閱讀(171) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆檔案(4)

文章檔案(3)

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久亚洲影院| 国产在线欧美| 日韩视频永久免费| 美女精品视频一区| 久久精品在线播放| 亚洲欧美精品中文字幕在线| 亚洲精品综合久久中文字幕| 欧美在线一级视频| 欧美一区二区女人| 亚洲欧美日韩国产一区二区| 国产精品99久久久久久白浆小说| 亚洲激情午夜| 99精品99| 久久成人羞羞网站| 久久一区二区三区超碰国产精品 | 欧美在线黄色| 久久久噜噜噜久久| 久久精品在线| 99re热这里只有精品视频| 亚洲第一在线视频| 亚洲日本视频| 亚洲欧美福利一区二区| 欧美在线一二三四区| 欧美激情乱人伦| 久久国产精品72免费观看| 久久国产精品久久w女人spa| 免费日韩成人| 中文在线资源观看网站视频免费不卡 | 久久精彩视频| 欧美激情精品久久久久久免费印度| 欧美日韩国产一级片| 黄色国产精品一区二区三区| 一区二区三区视频观看| 久久一区国产| 久久黄金**| 一区二区高清视频| 欧美视频在线免费看| 国产欧美日韩不卡| 亚洲每日更新| 亚洲激情小视频| 美女福利精品视频| 在线免费一区三区| 欧美成年人视频网站欧美| 欧美在线免费一级片| 国内外成人免费激情在线视频| 亚洲午夜电影网| 亚洲欧美在线另类| 国产一区二区三区的电影 | 久久综合五月| 男女激情久久| 日韩一区二区免费高清| 欧美日韩免费在线视频| 亚洲香蕉在线观看| 亚洲永久网站| 国产一区二区三区在线观看免费 | 欧美日韩一区二区在线视频| 亚洲国产色一区| 一区二区三区久久| 国产在线成人| 一区二区激情| 在线播放精品| 一区二区三区免费在线观看| 国产自产女人91一区在线观看| 另类激情亚洲| 国产农村妇女精品一二区| 亚洲成色777777女色窝| 国产精品高潮视频| 国产一区二区久久久| 亚洲国产91| 一区二区在线观看视频在线观看| 亚洲精品国久久99热| 亚洲国产aⅴ天堂久久| 亚洲综合成人在线| 宅男在线国产精品| 欧美国产国产综合| 欧美第十八页| 亚洲高清成人| 欧美/亚洲一区| 国产主播喷水一区二区| 欧美一区2区三区4区公司二百| 免播放器亚洲一区| 欧美va亚洲va香蕉在线| 国产一区二区三区四区| 亚洲欧美在线免费观看| 久久精品首页| 一区视频在线| 欧美va亚洲va日韩∨a综合色| 欧美国产日韩视频| 一区二区三区av| 国产欧美精品一区二区色综合| 国产一区二区丝袜高跟鞋图片| 99这里只有精品| 久久精品在线视频| 亚洲乱码一区二区| 国产精品一二| 欧美国产精品日韩| 亚洲性视频h| 亚洲国产综合视频在线观看| 一区二区免费在线视频| 国产丝袜一区二区三区| 亚洲欧美日韩天堂| 在线免费观看一区二区三区| 欧美xxx在线观看| 欧美在线日韩| 亚洲另类在线视频| 国产精品免费区二区三区观看| 久久精品理论片| 亚洲一区二区毛片| 欧美成人精品在线播放| 亚洲欧美日韩天堂| 亚洲你懂的在线视频| 最新精品在线| 亚洲国产另类久久精品| 国产农村妇女毛片精品久久莱园子| 另类图片国产| 老牛嫩草一区二区三区日本| 亚洲欧美日韩系列| 亚洲欧美成人在线| 欧美一区二区三区四区夜夜大片 | 伊人男人综合视频网| 国产精品一区二区三区免费观看 | 亚洲调教视频在线观看| 亚洲乱码国产乱码精品精天堂 | 激情欧美一区二区| 国产美女高潮久久白浆| 欧美视频一区在线观看| 久久免费一区| 欧美激情一区二区三区在线| 欧美成人免费视频| 欧美日韩一级片在线观看| 欧美成人一区二区三区在线观看| 久久久最新网址| 亚洲永久视频| 香港久久久电影| 久久成人亚洲| 欧美日韩国产成人在线免费| 久久免费视频一区| 久久成人精品| 欧美黄在线观看| 亚洲日韩视频| 午夜老司机精品| 久久天天狠狠| 国产精品高精视频免费| 国产自产2019最新不卡| 亚洲美女av黄| 久久久久.com| 欧美国产日本| 国产精品一区二区久久精品| 经典三级久久| 久久久青草婷婷精品综合日韩| 亚洲区第一页| 欧美激情综合色| 亚洲福利视频网站| 久久精品国产一区二区电影| 亚洲裸体视频| 欧美日韩在线三级| 99精品国产在热久久| 欧美国产日韩一区二区在线观看| 亚洲欧洲99久久| 国产日韩欧美在线观看| 91久久综合亚洲鲁鲁五月天| 久久久久久黄| 久久天天躁狠狠躁夜夜av| 激情六月婷婷综合| 久久蜜桃精品| 久久9热精品视频| 国产日韩欧美亚洲| 久久久免费精品视频| 欧美亚洲免费| 黄色av成人| 欧美成人网在线| 亚洲一区二区三区色| 99精品福利视频| 国产精品乱码| 免费一区视频| 欧美日韩国产91| 欧美主播一区二区三区| 久久国产免费看| 亚洲精品久久久蜜桃| 国产日韩高清一区二区三区在线| 欧美中日韩免费视频| 日韩小视频在线观看专区| 亚洲欧美第一页| 中国日韩欧美久久久久久久久| 亚洲性av在线| 亚洲作爱视频| 乱码第一页成人| 久久久最新网址| 国产亚洲永久域名| 亚洲女人av| 亚洲欧洲av一区二区| 欧美激情第二页| 亚洲国产高清一区| 伊大人香蕉综合8在线视| 亚洲欧美在线aaa| 欧美一区二区在线免费播放| 欧美日韩亚洲在线| 99re在线精品| 午夜国产不卡在线观看视频| 欧美日韩人人澡狠狠躁视频|