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

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 21:19 Chauncey 閱讀(602) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


導(dǎo)航

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

統(tǒng)計

常用鏈接

留言簿

隨筆檔案(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>
            亚洲欧美国产77777| 日韩一级黄色大片| 久久成人国产精品| 亚洲人成网站在线播| 午夜欧美电影在线观看| 亚洲激情小视频| 亚洲国产日韩欧美综合久久| 欧美日韩亚洲一区三区| 国产精品午夜在线观看| 国产精品一二三四区| 激情小说亚洲一区| 亚洲精品中文字| 一区二区三区黄色| 亚洲欧洲99久久| 看欧美日韩国产| 欧美喷潮久久久xxxxx| 久久精品夜色噜噜亚洲aⅴ| 看欧美日韩国产| 亚洲欧美国产精品va在线观看| 久久国产手机看片| 欧美激情综合网| 国外成人性视频| 久久国产精品久久久久久久久久| 免费在线看成人av| 欧美一区二区高清| 国产精品综合av一区二区国产馆| 亚洲最新合集| 亚洲日本va在线观看| 欧美综合第一页| 国产精品色婷婷久久58| 亚洲图片激情小说| 亚洲国产日韩在线| 欧美激情一区二区三区| 9l视频自拍蝌蚪9l视频成人 | 噜噜噜在线观看免费视频日韩| 亚洲一区二区免费在线| 久久精品在线免费观看| 久久精品99国产精品日本| 尤物在线观看一区| 亚洲欧美日韩国产一区| 欧美一区二区三区在| 久久网站热最新地址| 欧美美女bb生活片| 在线观看av不卡| 亚洲女同精品视频| 亚洲欧洲一区| 欧美成人蜜桃| 午夜视频一区二区| 欧美暴力喷水在线| 日韩系列欧美系列| 欧美国产视频一区二区| 精品二区久久| 久久成人免费电影| 亚洲欧美日韩一区在线| 欧美日韩蜜桃| 一本色道久久综合狠狠躁篇的优点 | 99在线精品免费视频九九视| 亚洲免费伊人电影在线观看av| 久久综合网络一区二区| 国产精品萝li| 亚洲日本理论电影| 欧美激情一二三区| 久久欧美中文字幕| 欧美午夜精品理论片a级按摩| 免费日韩av片| 日韩视频一区二区三区在线播放免费观看 | 亚洲欧美日韩精品久久亚洲区| 免费亚洲网站| 制服丝袜亚洲播放| 亚洲国产天堂久久综合网| 亚洲一区二区在线视频| 久久精品国产亚洲一区二区三区| 狠狠色丁香久久综合频道| 久久久之久亚州精品露出| 久久久91精品国产一区二区三区| 亚洲高清在线播放| 亚洲乱码国产乱码精品精天堂| 欧美日韩视频在线一区二区观看视频| 最新成人av网站| 亚洲夜间福利| 亚洲美女啪啪| 久久国产精品毛片| 在线亚洲激情| 亚洲第一在线综合在线| 亚洲一区二区精品在线| 国产精品第13页| 亚洲黄网站黄| 亚洲精品乱码久久久久久蜜桃91 | 久久久午夜电影| 一区二区三区精品久久久| 国产午夜精品一区二区三区视频 | 先锋亚洲精品| 欧美理论电影网| 免费观看一区| 激情六月婷婷久久| 久久女同互慰一区二区三区| 国产精品网站视频| 一区二区三区鲁丝不卡| 欧美日韩亚洲国产一区| 久久久亚洲影院你懂的| 欧美主播一区二区三区| 欧美在线观看视频| 国产精品久久二区| 性欧美激情精品| 国产欧美日韩综合| 欧美在线视频一区二区| 久久精品首页| ●精品国产综合乱码久久久久| 久久精品av麻豆的观看方式 | 亚洲免费大片| 欧美日韩国产经典色站一区二区三区| 中国成人在线视频| 国产欧美欧美| 久久一区二区三区四区| 亚洲看片网站| 亚洲人午夜精品免费| 欧美性天天影院| 久久婷婷国产综合精品青草| 日韩午夜免费| 亚洲第一久久影院| 宅男精品导航| 欧美久久久久久久久久| 午夜精品影院在线观看| 亚洲精品欧美日韩专区| 久久精品国内一区二区三区| 亚洲美女在线看| 亚洲国产成人久久综合| 国产精品人人爽人人做我的可爱 | 久久在线免费| 亚洲最新视频在线| 亚洲精品国产精品国自产在线| 久久精品国产免费观看| 午夜精品短视频| 久久久久久穴| 久久精精品视频| 久久精品一区二区三区四区| 亚洲一区二区在线观看视频| 久久久综合激的五月天| 尤物精品国产第一福利三区| 亚洲免费在线视频| 亚洲天堂网站在线观看视频| 亚洲综合电影| 久久三级视频| 日韩天堂av| 欧美中文在线字幕| 久久久青草婷婷精品综合日韩 | 宅男66日本亚洲欧美视频 | 91久久精品美女| 模特精品在线| 欧美激情免费在线| 欧美三级电影网| 欧美视频三区在线播放| 怡红院精品视频| 久久婷婷久久| 欧美日韩精品二区| 久久精品夜色噜噜亚洲a∨| 女仆av观看一区| 欧美一区二区在线免费观看| 亚洲国产欧美一区| 一区二区三区导航| 在线观看成人av电影| 亚洲午夜精品久久久久久浪潮| 国产精品羞羞答答| 欧美国产一区视频在线观看| 国产精品免费观看在线| 欧美二区视频| 国产日韩欧美电影在线观看| 欧美www在线| 国产欧美一区二区三区国产幕精品 | 亚洲国产专区校园欧美| 欧美丝袜第一区| 亚洲另类春色国产| 最新国产精品拍自在线播放| 亚洲欧美日韩国产综合在线| 9久re热视频在线精品| 欧美在线一区二区| 欧美尤物巨大精品爽| 欧美日韩1区2区| 亚洲精品久久久久久下一站| 尤物精品国产第一福利三区| 久久黄色级2电影| 久久久久久久一区二区| 国内激情久久| 久久久亚洲国产天美传媒修理工| 久久蜜桃精品| 亚洲国产精品久久久久婷婷884| 久久综合电影| 一区二区三区国产| 久久久久久久久久久成人| 国产自产高清不卡| 欧美精品久久久久久久久久| 亚洲国产视频一区二区| 一区二区高清视频| 国产精品日韩专区| 久久人人97超碰精品888| 亚洲国产精品久久91精品| 一区二区欧美国产| 狠狠色噜噜狠狠色综合久| 免费久久精品视频| 欧美一区二区三区播放老司机|