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

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>
            亚洲电影第1页| 欧美在线资源| 亚洲伦理在线观看| 亚洲精品乱码视频| 亚洲欧美一级二级三级| 久久xxxx精品视频| 久久精品论坛| 欧美精品尤物在线| 国产精品免费视频观看| 精品白丝av| 亚洲一二三四区| 老司机精品视频网站| 亚洲精品偷拍| 久久久久久久综合狠狠综合| 欧美色图首页| 亚洲国产精品一区二区www| 亚洲欧美日韩一区二区| 亚洲电影av在线| 欧美一进一出视频| 亚洲国产婷婷香蕉久久久久久99 | 国产精品久久久久久久久婷婷| 亚洲免费在线播放| 久久免费99精品久久久久久| 国产精品电影观看| 日韩一二三在线视频播| 欧美aa国产视频| 午夜精品久久久久久99热| 欧美激情视频一区二区三区不卡| 国产日本欧美视频| 亚洲一区二区在线免费观看| 欧美激情一区二区三区高清视频 | 亚洲私人影院| 欧美三级网址| 免费av成人在线| 久久精品一二三| 亚洲影视在线播放| 欧美二区视频| 国产精品二区二区三区| 久久综合久久88| 久久国内精品自在自线400部| 国产精品久久久久9999吃药| 免费国产一区二区| 国产视频一区欧美| 久久久久久999| 久久久久.com| 欧美在线免费视屏| 欧美日韩综合另类| 亚洲激精日韩激精欧美精品| 免费观看久久久4p| 日韩午夜三级在线| 蜜桃久久av一区| 亚洲日本欧美日韩高观看| 香蕉乱码成人久久天堂爱免费 | 欧美黄色日本| 你懂的成人av| 伊人精品在线| 亚洲区中文字幕| 国产精品少妇自拍| 久久亚洲一区二区| 国产亚洲精品一区二区| 美腿丝袜亚洲色图| 国自产拍偷拍福利精品免费一| 欧美二区在线看| 国产精品草莓在线免费观看| 午夜精品三级视频福利| 欧美小视频在线| 一区二区三区高清在线| 国产综合第一页| 最新日韩在线视频| 日韩亚洲精品视频| 欧美日韩高清区| 老司机午夜免费精品视频| 国产一区二区三区在线观看免费视频| 亚洲综合色激情五月| 亚洲精品中文在线| 欧美精品一区二区蜜臀亚洲 | 香蕉久久夜色精品| 麻豆国产精品777777在线| 免费成人高清| 亚洲免费福利视频| 欧美日韩在线精品| 嫩草国产精品入口| 亚洲精品免费在线观看| 欧美视频在线观看一区二区| 亚洲视频在线观看三级| 久久国产精品久久久久久| 久久久蜜臀国产一区二区| 老牛嫩草一区二区三区日本 | 亚洲激情不卡| 欧美一区二区三区视频免费播放| 亚洲日本免费电影| 国产精品成av人在线视午夜片| 亚洲欧美福利一区二区| 农村妇女精品| 亚洲在线免费| 在线观看日韩一区| 欧美色道久久88综合亚洲精品| 香蕉久久精品日日躁夜夜躁| 欧美国产在线视频| 欧美一级视频精品观看| 亚洲高清视频在线观看| 国产精品久久久久aaaa| 另类图片国产| 老鸭窝亚洲一区二区三区| 99精品99久久久久久宅男| 国产精品日韩欧美| 蜜桃av一区二区| 亚洲在线观看视频| 午夜精品免费| 亚洲精品一区二区三区四区高清 | 91久久精品一区| 欧美成人综合网站| 亚洲欧美日韩一区二区三区在线观看 | 欧美mv日韩mv亚洲| 西西人体一区二区| 日韩一本二本av| 亚洲在线免费| 最近中文字幕mv在线一区二区三区四区 | 中国成人亚色综合网站| 亚洲国产精品热久久| 午夜久久福利| 欧美激情一区二区| 亚洲福利av| 欧美极品在线播放| 欧美一区三区二区在线观看| 美女网站在线免费欧美精品| 亚洲在线免费| 亚洲国产日韩欧美| 国产一区二区三区在线观看网站| 午夜精品婷婷| 99国产精品久久久久久久久久| 亚洲一区美女视频在线观看免费| 国产精品毛片| 欧美激情视频一区二区三区在线播放| 香蕉精品999视频一区二区 | 亚洲高清资源| 久久综合久久综合久久| 欧美精品亚洲二区| 午夜精品久久久99热福利| 亚洲一区精彩视频| 一本久道久久综合狠狠爱| 亚洲激情在线观看| 久久久久久久久久久久久久一区 | 好吊视频一区二区三区四区| 欧美视频一区二| 欧美视频一区二区三区在线观看 | 久久不射电影网| 久久免费黄色| 久久综合网hezyo| 久久只精品国产| 久久夜色精品一区| 欧美精品国产一区二区| 欧美日韩一二三区| 欧美三日本三级少妇三2023| 欧美日韩黄色大片| 国产精品国产自产拍高清av| 国产毛片久久| 欧美高清不卡在线| 欧美精品三级| 国产精品va在线播放| 国产精品久久久久久户外露出 | 久久aⅴ国产欧美74aaa| 亚洲九九爱视频| 99精品热视频| 午夜一区在线| 裸体素人女欧美日韩| 欧美精品一区在线| 国产精品夜夜夜| 在线高清一区| 中国亚洲黄色| 亚洲国产婷婷香蕉久久久久久99| 日韩视频免费观看高清完整版| 亚洲桃花岛网站| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美福利一区二区| 亚洲视频播放| 久久久久国产免费免费| 欧美精品国产精品| 国产一区二区三区在线观看免费视频| 在线精品一区| 亚洲欧美日韩在线高清直播| 看欧美日韩国产| 一区二区三区四区五区视频| 欧美在线观看一区二区| 欧美黄在线观看| 国产一区二区av| 亚洲午夜精品久久| 亚洲福利久久| 欧美一区二区视频网站| 欧美四级在线观看| 亚洲精品一级| 久久天堂精品| 亚洲女优在线| 欧美日韩免费观看一区三区| 在线观看视频亚洲| 久久精品夜色噜噜亚洲aⅴ| 亚洲免费av电影| 欧美国产日本在线| 一区在线观看视频| 久久精品国产v日韩v亚洲 |