矩陣 十進位制快速冪 NOI2013 矩陣遊戲

2022-05-20 07:53:02 字數 4170 閱讀 7321

婷婷是個喜歡矩陣的小朋友,有一天她想用電腦生成乙個巨大的

n 行

m 列的矩陣(你不用擔心她如何儲存)。她生成的這個矩陣滿足乙個神奇的性質:

若用 fi,

j 來表示矩陣中第

i 行第

j 列的元素,則 fi

,j滿足下面的遞推式:⎧⎩

⎨⎪⎪f

1,1f

i,jf

i,1=

==1a

⋅fi,

j−1+

bc⋅f

i−1,

m+dj

≠1i≠

1遞推式中 a,

b,c,

d 都是給定的常數。

現在婷婷想知道 fn

,m的值是多少,請你幫助她。由於最終結果可能很大,你只需要輸出 fn

,m除以

1000000007

的餘數。

包含一行有六個整數 n,

m,a,

b,c,

d。意義如題所述。

表示 fn,

m 除以

1000000007

的餘數。

input

3 4 1 3 2 6
output
85
explanation

樣例中的矩陣為:⎛⎝

⎜12676429

7973282

103585⎞

⎠⎟測試點編號

資料範圍11

≤n,m

≤10;1

≤a,b

,c,d

≤100021

≤n,m

≤100;1

≤a,b

,c,d

≤100031

≤n,m

≤103;

1≤a,

b,c,

d≤109

41≤n

,m≤10

3;1≤

a,b,

c,d≤

10951

≤n,m

≤109;

1≤a=

c≤109

;1≤b

=d≤10

961≤

n,m≤

109;a

=c=1

;1≤b

,d≤10

971≤

n,m,

a,b,

c,d≤

10981

≤n,m

,a,b

,c,d

≤1099

1≤n,

m,a,

b,c,

d≤109

101≤n

,m,a

,b,c

,d≤10

9111≤

n,m≤

101000;a

=c=1

;1≤b

,d≤10

9121≤

n,m≤

101000;1

≤a=c

≤109;

1≤b=

d≤109

131≤n

,m≤10

1000;1

≤a,b

,c,d

≤10914

1≤n,

m≤101000;1

≤a,b

,c,d

≤10915

1≤n,

m≤1020000;1

≤a,b

,c,d

≤10916

1≤n,

m≤1020000;1

≤a,b

,c,d

≤10917

1≤n,

m≤101000000;a

=c=1

;1≤b

,d≤10

9181≤

n,m≤

101000000;1

≤a=c

≤109;

1≤b=

d≤109

191≤n

,m≤10

1000000;1

≤a,b

,c,d

≤10920

1≤n,

m≤101000000;1

≤a,b

,c,d

≤109時間限制:1s

空間限制:

256mb

可以很容易地推出矩陣(f

i,j+

11)=

(fi,

j1)×

(ab0

1)(f

i+1,

11)=

(fi,

m1)×

(cd0

1)然後可以快速冪算出fi

,1和f

i,m,然後算出和fi

+1,1

之間的矩陣。然後繼續快速冪就好了。

由於指數是高精度數,所以使用十進位制快速冪算比較方便。

ps:高精度粘的版,很長。。。

#include

#include

#include

#define mod 1000000007

#define maxlen 1000000

using

namespace

std;

int a,b,c,d;

char s[maxlen+10];

void read(int &x)

}void read_mod(int &x)

}struct matrix

inline matrix(int)

inline matrix operator*(const matrix &b)const

inline matrix &operator*=(const matrix &b)

}a,b,c;

struct hp

hp(int n)

if(!a[0])

a[0]=1;

}hp(char *s)

hp operator*(const hp &b)const

while(len>1&&!c.a[len])

len--;

c.a[0]=len;

return c;

}hp operator/(int b)const

while(len>1&&!c.a[len])

len--;

c.a[0]=len;

return c;

}hp operator+(const hp &b)const

len++;

while(len>1&&!c.a[len])

len--;

c.a[0]=len;

return c;

}hp operator-(const hp &b)const

while(len>1&&!c.a[len])

len--;

c.a[0]=len;

return c;

}void

operator*=(const hp &x)

void

operator/=(const

int &x)

void

operator+=(const hp &x)

void

operator-=(const hp &x)

void print()

bool

operator>(const hp&b)const

bool

operator

<(const hp&b)const

bool

operator

<=(const hp&b)const

hp operator/(const hp&b)const

return l;

}void

operator/=(const hp&b)

}n,m;

template

t quick_pow(t a,int b)

return ret;

}void read()

template

t quick_pow10(t a,hp b)

return ret;

}void solve()

int main()

十進位制快速冪

題目 題意 矩陣f滿足以下遞推式 輸入八個整數n,m,a,b,c,d,e,f,輸出f n m 2012182013的值。分析 本題需要構造矩陣,那麼首先我們根據遞推式 可以構造 可以看出,我們還需要求f n 2 和f n 1 的值。那麼繼續,根據 我們先利用上面的式子消去下面式子中的f i 1 得到...

十進位制快速冪

problem 2 input file power.in output file power.out time limit 1 second memory limit 256 mb mr.ding 打算考一道比較顯然的題目,低頭一想,就有了這道題。mr.ding 需要你計算 3 n mod 10 ...

二進位制快速冪及矩陣快速冪

二進位制快速冪 二進位制快速冪雖然不難寫,但是無奈總是會忘,所以還是在這裡把板子寫一下。二進位制快速冪很好理解 假設我們要求a b,那麼其實b是可以拆成二進位制的,該二進位制數第i位的權為2 i 1 例如當b 11時,11的二進位制是1011,11 2 1 2 0 2 1 2 1,因此,我們將a 轉...