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

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 閱讀(593) 評論(0)  編輯 收藏 引用

導航

<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

統計

常用鏈接

留言簿

隨筆檔案(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| 亚洲欧美精品在线观看| 亚洲视频在线观看一区| 亚洲欧美国产日韩中文字幕| 欧美中文字幕在线播放| 久久免费视频一区| 欧美大片在线看免费观看| 91久久综合| 亚洲另类春色国产| 性欧美1819sex性高清| 久久婷婷综合激情| 欧美日韩色综合| 国产亚洲精品久久久久久| 在线看日韩欧美| 亚洲午夜影视影院在线观看| 久久久www成人免费毛片麻豆| 欧美韩国日本综合| 亚洲性av在线| 欧美大片在线观看一区二区| 国产精品久久久久久久久久尿| 国产一区二区三区的电影| 一本色道久久综合亚洲精品小说| 亚洲欧美日韩成人| 欧美成人午夜剧场免费观看| 一本一本a久久| 久久先锋影音av| 国产精品久久久久久久久免费| 在线精品视频免费观看 | 一区二区三区你懂的| 欧美专区18| 亚洲精品资源| 麻豆精品网站| 国一区二区在线观看| 午夜精品一区二区三区在线播放 | 欧美日韩国产精品一区| 国产一区欧美日韩| 午夜精品久久久久久久久久久| 欧美激情小视频| 亚洲欧洲av一区二区三区久久| 开心色5月久久精品| 亚洲一区二区在线播放| 欧美日韩不卡视频| 亚洲黄色视屏| 蜜桃精品久久久久久久免费影院| 黄色成人在线观看| 亚洲影院污污.| 欧美专区亚洲专区| 久久久综合香蕉尹人综合网| 欧美成年网站| 久久国产精品久久久久久电车| 欧美日韩在线亚洲一区蜜芽| 亚洲每日在线| 亚洲高清影视| 牛牛精品成人免费视频| 精品av久久久久电影| 久久激情视频免费观看| 亚洲欧美日韩精品久久久| 国产精品欧美日韩| 性欧美超级视频| 亚洲伊人久久综合| 国产精品美女在线| 欧美一区二区三区四区夜夜大片| 夜夜嗨一区二区三区| 欧美三级免费| 午夜精品久久久久久久久久久| 亚洲一级片在线观看| 国产精品羞羞答答| 久久久蜜桃一区二区人| 久久久亚洲人| 日韩视频免费观看高清在线视频 | 艳妇臀荡乳欲伦亚洲一区| 亚洲国产精品ⅴa在线观看 | 老司机亚洲精品| 久久亚洲私人国产精品va| 亚洲国产第一页| 亚洲人成在线免费观看| 国产精品毛片a∨一区二区三区|国| 午夜精品久久久久久久蜜桃app| 午夜精品久久久久| 亚洲国产综合视频在线观看| 亚洲精品男同| 国产丝袜一区二区| 欧美激情中文字幕在线| 欧美三级第一页| 久久精品成人欧美大片古装| 老司机精品视频网站| 一区二区三区蜜桃网| 亚洲欧美日韩精品综合在线观看| 一区二区视频免费完整版观看| 亚洲高清激情| 国产精品中文字幕在线观看| 国产日韩欧美一区| 噜噜噜在线观看免费视频日韩| 欧美xxx在线观看| 欧美中文字幕精品| 欧美另类人妖| 久久蜜桃资源一区二区老牛| 欧美美女喷水视频| 久久视频在线看| 国产精品久久一卡二卡| 免费一区二区三区| 国产精品免费aⅴ片在线观看| 女人天堂亚洲aⅴ在线观看| 欧美视频在线观看视频极品| 久久综合国产精品| 国产精品高潮在线| 亚洲高清久久| 激情小说另类小说亚洲欧美| 99视频精品全部免费在线| 樱花yy私人影院亚洲| 亚洲一区二区三区激情| 日韩网站在线观看| 久久久久久伊人| 性欧美videos另类喷潮| 欧美日韩一区二区免费视频| 亚洲第一主播视频| 黄色工厂这里只有精品| 亚洲一区二区视频| 亚洲小视频在线| 欧美日韩高清在线播放| 欧美成人资源| 在线观看日韩av电影| 久久爱www| 久久精品欧洲| 国产欧美一区二区三区久久人妖| 一区二区免费在线播放| 一区二区三区欧美亚洲| 欧美韩日一区二区| 亚洲国产黄色| 亚洲精品一区二区三区99| 久久综合99re88久久爱| 欧美xart系列高清| 影音先锋亚洲精品| 久久人人爽人人爽爽久久| 久久综合九色| 经典三级久久| 老司机67194精品线观看| 欧美二区在线观看| 亚洲欧洲精品一区| 欧美福利在线观看| 亚洲麻豆一区| 亚洲欧美久久久| 国产日韩免费| 久久久久久综合| 亚洲国产精品悠悠久久琪琪| 亚洲毛片在线看| 国产精品免费观看在线| 亚洲综合色视频| 久热精品视频在线免费观看 | 欧美日韩午夜在线| aⅴ色国产欧美| 午夜天堂精品久久久久| 国产一区成人| 久久久亚洲国产天美传媒修理工 | 欧美尤物巨大精品爽| 久久婷婷色综合| 亚洲电影免费在线观看| 在线视频你懂得一区| 国产精品美女久久| 久久一区中文字幕| 日韩视频不卡中文| 久久久久国产精品厨房| 欧美成人免费小视频| 亚洲精品中文在线| 国产精品美女久久久免费| 欧美一区二视频| 亚洲国产精品成人精品| 亚洲天堂av图片| 国内外成人免费视频| 欧美激情综合| 欧美在线不卡| 夜夜躁日日躁狠狠久久88av| 久久亚洲捆绑美女| 夜夜爽夜夜爽精品视频| 国产一区二区在线观看免费播放| 蜜桃精品久久久久久久免费影院| 亚洲午夜未删减在线观看| 欧美高清在线| 欧美亚洲三级| 日韩一级黄色大片| 国内精品福利| 国产精品久久影院| 欧美国产免费| 久久精品国产免费看久久精品| 一本大道久久a久久综合婷婷| 浪潮色综合久久天堂| 性高湖久久久久久久久| 夜夜爽www精品| 亚洲激情成人网| 黄色成人在线| 国产偷久久久精品专区| 国产精品久久久久9999| 欧美激情中文字幕在线| 久久视频免费观看| 欧美永久精品| 性欧美暴力猛交69hd| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲经典一区| 国产真实久久|