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

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) 評(píng)論(0)  編輯 收藏 引用


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


導(dǎo)航

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

統(tǒng)計(jì)

常用鏈接

留言簿

隨筆檔案(4)

文章檔案(3)

搜索

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久躁狠狠躁夜夜爽| 久久成人国产| 亚洲一区二区少妇| 久久精品麻豆| 欧美在线免费观看| 欧美一区二区三区电影在线观看| 亚洲午夜电影网| 亚洲少妇自拍| 欧美在线视屏| 欧美成人国产va精品日本一级| 欧美www在线| 亚洲人成人77777线观看| 麻豆国产va免费精品高清在线| 老色鬼精品视频在线观看播放| 欧美大片一区| 在线中文字幕一区| 久久精品国产精品亚洲综合| 欧美成人在线影院| 国产精品久久久久久影院8一贰佰| 国产精品免费视频xxxx| 亚洲第一综合天堂另类专| 欧美日一区二区三区在线观看国产免| 亚洲精品少妇30p| 亚洲欧美一区二区精品久久久| 久久久久久穴| 亚洲国产成人精品女人久久久| 亚洲人成啪啪网站| 先锋影音久久久| 欧美福利小视频| 国产精品热久久久久夜色精品三区 | 一区二区三区不卡视频在线观看| 性亚洲最疯狂xxxx高清| 欧美大学生性色视频| 亚洲国产日韩欧美在线99| 亚洲精品免费一区二区三区| 亚洲欧美中文在线视频| 欧美视频中文在线看| 夜夜嗨av一区二区三区中文字幕 | 欧美视频在线播放| 亚洲国产精品视频一区| 久久av一区二区三区亚洲| 欧美成人精品三级在线观看| 亚洲主播在线播放| 欧美日韩在线大尺度| 亚洲国产精品专区久久| 久久久天天操| 亚洲一区二区精品在线| 欧美日韩免费高清| 日韩一级片网址| 亚洲大片在线| 噜噜噜躁狠狠躁狠狠精品视频| 国产一区999| 欧美在线观看视频一区二区三区| 亚洲视频一二区| 欧美性理论片在线观看片免费| 亚洲国产第一页| 亚洲视频一区二区| 亚洲一区二区三区在线视频| 欧美大片一区二区三区| 久久国产夜色精品鲁鲁99| 国产一区二区三区四区在线观看 | 久久久精品视频成人| 国内精品久久久久影院优| 久久久久久久波多野高潮日日| 销魂美女一区二区三区视频在线| 国产精品国产亚洲精品看不卡15| 一本一本久久| 亚洲一区二区免费视频| 国产精品最新自拍| 久久久久国产一区二区三区四区 | 欧美日本中文字幕| 日韩午夜中文字幕| 欧美成人午夜77777| 一区二区三区国产精品| 国产精品v片在线观看不卡| 亚洲一卡二卡三卡四卡五卡| 亚洲一区二区黄色| 国产一区欧美| 亚洲成人中文| 欧美日韩色一区| 欧美亚洲免费电影| 久久久久久久高潮| 日韩亚洲不卡在线| 亚洲一二三级电影| 永久免费毛片在线播放不卡| 国外精品视频| 亚洲国产精品一区二区久| 欧美色精品天天在线观看视频| 香蕉久久一区二区不卡无毒影院| 欧美一区二区在线看| 国内外成人免费视频| 欧美自拍丝袜亚洲| 欧美α欧美αv大片| 一本一本久久a久久精品牛牛影视| 亚洲欧美日本在线| 黄色亚洲大片免费在线观看| 亚洲黄色成人| 国产精品剧情在线亚洲| 老色批av在线精品| 欧美性大战久久久久| 美女精品自拍一二三四| 欧美精品在线播放| 久久久青草婷婷精品综合日韩 | 亚洲欧美国产va在线影院| 亚洲国产综合91精品麻豆| 国产精品99久久久久久www| 亚洲高清激情| 新67194成人永久网站| 午夜精品久久久| 欧美日韩a区| 欧美亚洲自偷自偷| 激情综合网址| 亚洲精品一区二区三区蜜桃久| 国产精品一区在线播放| 亚洲丰满少妇videoshd| 国产精品自在在线| 亚洲精品影视| 影音先锋欧美精品| 亚洲欧美中文日韩在线| 中文亚洲欧美| 欧美国产丝袜视频| 免费成人美女女| 国产在线精品自拍| 亚洲综合色自拍一区| 一区二区三区日韩欧美| 欧美成人精品三级在线观看| 久久久久一区二区| 国产欧美一区二区三区国产幕精品| 亚洲精品日韩激情在线电影| 亚洲第一区在线| 欧美一区二区大片| 亚洲调教视频在线观看| 一本不卡影院| 久久夜色精品国产亚洲aⅴ| 欧美日韩成人一区二区| 你懂的一区二区| 国内揄拍国内精品久久| 午夜亚洲性色视频| 久久成人免费| 国产一区二区久久| 久久国产精品久久久| 久久久久免费视频| 伊人狠狠色丁香综合尤物| 亚洲欧美日韩国产一区| 欧美日韩中文另类| 一区二区三区精品| 欧美亚洲在线| 国产一区亚洲| 久久视频一区| 最新国产拍偷乱拍精品| 一本色道久久99精品综合| 欧美精品一线| 亚洲一区二区精品| 久久精品成人一区二区三区蜜臀| 国产日韩一区二区三区在线播放| 亚洲欧美日产图| 蜜臀99久久精品久久久久久软件| 亚洲福利精品| 欧美日韩国产成人在线| 亚洲视频高清| 另类图片国产| 欧美日韩精品免费观看视频完整 | 亚洲一级二级在线| 欧美国产欧美亚洲国产日韩mv天天看完整 | 中文国产成人精品久久一| 午夜一区不卡| 亚洲电影网站| 欧美日韩国产欧美日美国产精品| 一区二区三区四区国产精品| 久久成人综合网| 亚洲激情成人网| 亚洲欧美在线一区二区| 老司机aⅴ在线精品导航| 亚洲一区二区三区乱码aⅴ| 国产酒店精品激情| 美国十次成人| 亚洲欧美日韩久久精品| 欧美国产三级| 欧美一级大片在线免费观看| 欧美国产在线视频| 欧美亚洲午夜视频在线观看| 亚洲国产一区二区在线| 国产精品午夜久久| 欧美国产日韩一二三区| 久久爱另类一区二区小说| 亚洲精品欧美日韩专区| 另类激情亚洲| 性做久久久久久| 一本色道久久综合亚洲精品婷婷 | 美女成人午夜| 亚洲欧美电影在线观看| 麻豆成人综合网| 亚洲一区欧美二区| 亚洲欧美制服另类日韩| 性视频1819p久久| 亚洲网址在线| 老色鬼精品视频在线观看播放| 亚洲一区二区三区久久| 亚洲国产精品悠悠久久琪琪| 国产精品一区二区欧美|