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

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精品久久久久久| 久久精品视频在线观看| 久久久噜噜噜久久中文字免| 久久亚洲精品伦理| 欧美成年视频| 欧美亚洲第一页| 国产午夜精品久久久| 精品二区视频| a91a精品视频在线观看| 欧美一区二区视频观看视频| 久久久久国产精品午夜一区| 欧美成人在线网站| 亚洲午夜精品福利| 麻豆成人小视频| 99视频精品全国免费| 欧美国产综合视频| 亚洲一区二区网站| 欧美一区二粉嫩精品国产一线天| 夜夜嗨av一区二区三区免费区| 亚洲免费观看视频| 99re在线精品| 国产精品国内视频| 亚洲欧美另类国产| 麻豆av福利av久久av| 国产精品草草| 亚洲承认在线| 欧美一区二区三区成人| 亚洲国产精品久久久久婷婷老年| 99精品99久久久久久宅男| 久久精品男女| 国产精品久久久久久av下载红粉 | 欧美成人综合| 亚洲一区二区在线免费观看视频| 久久国产精彩视频| 国产精品视频xxxx| 一区二区毛片| 亚洲第一页在线| 久久久久久91香蕉国产| 国产精品网站在线播放| 宅男精品导航| 亚洲精品日韩久久| 美日韩精品视频| 好吊妞**欧美| 久久精品亚洲一区二区三区浴池| 一本色道久久综合亚洲91| 欧美国产综合一区二区| 在线观看亚洲视频| 久久综合久久88| 欧美一区二区三区免费视频| 国产精品高清在线观看| 亚洲少妇在线| 亚洲最新合集| 国产精品国产一区二区 | 麻豆精品一区二区综合av| 亚洲欧美变态国产另类| 国产精品毛片va一区二区三区| 一本到高清视频免费精品| 亚洲国产一区二区三区青草影视| 麻豆freexxxx性91精品| 亚洲国产小视频| 亚洲黄网站在线观看| 男人插女人欧美| 在线电影国产精品| 欧美国产第一页| 欧美日韩高清不卡| 99精品视频一区二区三区| 久久这里只有精品视频首页| 亚洲看片免费| 亚洲影院色无极综合| 黄色小说综合网站| 亚洲黄色小视频| 狠狠入ady亚洲精品| 亚洲一区二区三区精品在线| 一区二区三区四区在线| 亚洲欧美日韩成人高清在线一区| 国产欧美日韩精品在线| 久久久久久久精| 久久久久久亚洲精品中文字幕| 在线成人www免费观看视频| 亚洲娇小video精品| 国产精品劲爆视频| 久久精品99国产精品日本| 久久久精品视频成人| 亚洲欧洲精品一区| 中文久久乱码一区二区| 黄色精品网站| 亚洲人体1000| 亚洲图片欧洲图片av| 激情欧美日韩| 日韩视频免费观看高清完整版| 国产精品一区毛片| 免费国产一区二区| 欧美三级视频| 久色成人在线| 欧美日韩在线电影| 久久综合国产精品| 欧美日韩国产综合新一区| 欧美在线免费播放| 欧美久久电影| 久久综合色播五月| 国产精品乱码一区二区三区| 久久艳片www.17c.com| 欧美视频中文字幕| 欧美电影免费观看高清| 国产精品性做久久久久久| 亚洲国产精品成人精品| 国外精品视频| 午夜精品亚洲| 国产精品永久免费观看| 久久精品国产第一区二区三区| 久久成人18免费观看| 亚洲激情一区二区三区| 国产免费观看久久黄| 欧美影视一区| 亚洲视频综合| 亚洲欧洲日本在线| 香蕉久久夜色| 一区二区久久久久久| 一区二区三区久久网| 欧美综合国产| 午夜亚洲影视| 欧美日韩一区视频| 亚洲经典三级| 亚洲国产精品ⅴa在线观看| 久久av二区| 久久国产毛片| 国产日韩综合| 欧美一区二区三区成人| 欧美一区二区三区在线观看 | 欧美成年人网站| 红桃视频一区| 久久精品国产免费观看| 久久久久久久久岛国免费| 国产精自产拍久久久久久| 亚洲欧美激情视频| 午夜精品美女自拍福到在线| 欧美日韩一区在线视频| 亚洲最黄网站| 欧美一区二区三区在线播放| 国产欧美日韩一级| 欧美中文在线观看| 美脚丝袜一区二区三区在线观看| 雨宫琴音一区二区在线| 美腿丝袜亚洲色图| 亚洲精品1234| 亚洲欧美日韩视频二区| 国产欧美韩国高清| 久久激情视频久久| 欧美电影电视剧在线观看| 亚洲精品乱码久久久久久日本蜜臀 | 久久精品中文| 欧美大片网址| 艳女tv在线观看国产一区| 欧美日韩亚洲一区在线观看| 一区二区三区四区国产| 久久国产精品久久国产精品| 在线播放国产一区中文字幕剧情欧美 | 欧美国产欧美综合 | 欧美成人午夜| 夜夜嗨av一区二区三区网页| 午夜精品福利一区二区蜜股av| 国产精品视频一区二区三区 | 国产美女在线精品免费观看| 久热精品视频在线| 欧美一区二视频| 亚洲人午夜精品| 免费亚洲一区二区| 亚洲午夜精品久久久久久浪潮| 久久夜色精品国产| 最新精品在线| 久久精品国产欧美亚洲人人爽 | 亚洲欧美日韩天堂| 韩曰欧美视频免费观看| 欧美啪啪一区| 久久精品夜色噜噜亚洲a∨ | 久久一本综合频道| 亚洲图片欧美午夜| 欧美第一黄色网| 欧美在线观看一区二区| 最新亚洲电影| 国产一二精品视频| 欧美色精品天天在线观看视频| 欧美一区二区三区另类| 一区二区三区www| 欧美国产日韩在线观看| 欧美一区二区三区在线观看| 一区二区三区日韩在线观看| 在线日韩av片| 国产亚洲激情视频在线| 欧美日韩国产一区二区| 美女视频网站黄色亚洲| 久久精品国产99| 亚洲欧美日韩综合一区| 亚洲免费观看高清完整版在线观看| 欧美二区在线观看|