2015-02

Recursion and Mod

同餘

a\%M=a',\ b\%M=b'
a%M=a, b%M=b
(a+b)\%M=(a'+b')\%M
(a+b)%M=(a+b)%M
(a*b)\%M\ =(a'*b')\%M
(ab)%M =(ab)%M

題目敘述

Definition:

a_{1} = 1
a1=1
a_{n} = 3*a_{n-1} + 4
an=3an1+4

解法一

就照著遞迴式做

a = 1
MOD = 10**9 + 9
for _ in range(N-1):
    a = (3*a+4) % MOD

時間複雜度:

O(N)=O(2^{63})=TLE
O(N)=O(263)=TLE

0.4

解法二

先觀察數列

a_{1}=1,a_{2}=7,a_{3}=25,a_{4}=79
a1=1,a2=7,a3=25,a4=79

似乎有甚麼規律

解法二

按照定義展開

a_{1}=1
a1=1
a_{2}=3*a_{1}+4
a2=3a1+4
a_{3}=3*a_{2}+4=3*(3*a_{1}+4)+1
a3=3a2+4=3(3a1+4)+1

解法二

a_{4}=3*a_{3}+4
a4=3a3+4
=3*(3*a_{2}+4)+4
=3(3a2+4)+4
=3*(3*(3*a_{1}+4)+4)+4
=3(3(3a1+4)+4)+4
=3^{3}*a_{1}+4*(3^{2}+3^{1}+3^{0})
=33a1+4(32+31+30)
=3^{3}+4*(3^3-1)/(3-1)
=33+4(331)/(31)
=3^{3}+2*3^{3}-2
=33+2332
=3^{4}-2
=342

解法二

再用數學歸納法仔細證明

a_{n}=3^{n}-2
an=3n2
n=1 =>a_{1}=3^{1}-2=1
n=1=>a1=312=1
n=k+1=>a_{k+1}=3*a_{k}+4
n=k+1=>ak+1=3ak+4
=3*(3^{k}-2)+4
=3(3k2)+4
=3^{k+1}-2
=3k+12

解法二

因此我們得知

a^{n}=3^n-2
an=3n2
a = 1, MOD = 10**9 + 9
for _ in range(n):
    a = (3*a) % MOD
a = a - 2

時間複雜度:

O(N)=O(2^{63})=TLE
O(N)=O(263)=TLE

0.4

解法三

把遞迴式變成一般式

目標: 如何快速求得       ???

3^{n}
3n

快速冪

Fast Exponential Algorithm

快速冪

a^{n}={(a^{n/2})}^{2}
an=(an/2)2
={(a^{[n/2]})}^{2}*a
=(a[n/2])2a

if n is even

if n is odd

解法三

MOD = 10**9 + 9
def pow(a, n):
    if n == 0:
        return 1
    half = pow(a, n//2)
    if n&1 == 1:
        return (((half**2)%MOD)*a)%MOD
    else:
        return (half**2)%MOD

時間複雜度:

O(lgN)=O(lg2^{63})=O(63)
O(lgN)=O(lg263)=O(63)

AC

快速冪 迴圈版

ans = 1, A = a, MOD = 10**9 + 9
for i in range(32):
    if (N>>i)&1:
        ans = (ans*A) % MOD
    A = (A*A) % MOD

GPE 5/18

By allenwhale

GPE 5/18

  • 1,022