NOI2013矩陣遊戲

2021-08-07 07:07:48 字數 3012 閱讀 7711

題目鏈結luogu1397矩陣遊戲

題目大意

已知 ⎧⎩⎨

⎪⎪f1

,1=1

fi,j

=a∗f

i,j−

1+bf

i,1=

c∗fi

−1,m

+d[j

!=1]

[i≠1

] 求f

n,m

我們可以構造矩陣 [1

fn,1

]×[1

0ba]

m−1=

[1fn

,m]

⇒ [1

c∗fn

−1,m

+d]×

[10b

a]m−

1=[1

fn,m

] ⇒

令t=[

10ba

]m−1

x=t2,2

y=t1

,2 ∴

fn,m

=x∗c

∗fn−

1,m+

x∗d+

y ⇒

[1f1

,m]×

[10x

∗d+y

x∗c]

n−1=

[1fn

,m]

所以我們可以先快速冪求出f1

,m然後再快速冪求出fn

,m但是由於n,

m 很大n,

m≤101000000

我們用高精度顯然超時,而且非常不好打

因為109+

7 是乙個質數,所以我們考慮費馬小定理 ap

−1≡1

(modp)

⇒an≡

an(modp−

1)(modp)

因為矩陣乘法也是滿足費馬小定理的

但是有一點問題(這裡只舉例說2×

2 的矩陣 n×

n 的矩陣也是一樣的) [a

cbd]

p−1≡

[100

1]if a≠d

(modp)

[acb

d]p≡

⎧⎩⎨⎪

⎪⎪⎪⎪

⎪⎪⎪⎪

⎪[a0

0a][

acbd

]if a=d

if a≠d

(modp)

又在這道題中兩個矩陣的

a 都為1⇒

[1fn

,1]×

[10b

a]m−

1=[1

fn,1

]×⎧⎩

⎨⎪⎪⎪

⎪⎪⎪⎪

⎪⎪⎪⎪

⎪[10

ba]m

−1(modp)

[10b

a]m−

1(modp−1

)if a=1

if a≠1

所以我們可以直接取模,對於第二個矩陣快速冪也要判斷一下x∗

c 是否等於1

否則會被uoj上的資料ha

ck掉(當然你第二個不判斷也可以過官方資料,第乙個不判你也有85分)

這裡貼**(**有一些奇奇怪怪的東西 當然你可以無視)

#include

#include

#define re register int

#define fp(i,a,b) for(re i=a,i=b;i<=i;++i)

#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

char ss[1

<<17],*a=ss,*b=ss,ch;

inline

char gc()return*a++;}

template

inline

void sdf(t&x)

inline

void cis(char*s)

char sr[1

<<20],z[20];int c=-1,z;

template

inline

void wer(t x)

const

int n=3,p=1e9+7;

typedef

int arr[n];

typedef

long

long ll;

struct matrix

matrix(re x=0)

inline matrix operator*(matrix b)const

matrix operator^(ll b)

}t;ll ans=1,n,m,a,b,c,d,mod=p-1;char s1[1000010],s2[1000010];

int main()

對於這種一階遞推式我們完全可以用等比數列的通項公式來求(反正上必修五老師會講怎求的)注意接下來的運算都是帶取模的,模數p=

109+7

fn,m=a∗

fn,m

−1+b

fn,m

=return

*a++;}

templateinline void sdf(t&x)

inline void cis(char*s)

char sr[1

<<20],z[20];int c=-1,z;

templateinline void wer(t x)

const int n=3,p=1e9+7;

typedef int arr[n];

typedef long long ll;

ll ans,n,m,a,b,c,d,mod;char s1[1000010],s2[1000010];

inline ll powmod(rg a,rg b)

int main()這兩份**的複雜度都是一樣的,主要卡在讀入上。讀者可以考慮把n%p和n%(p-1)都存下來,不要先存字串。這樣的話會快一些(純粹是為了刷個排名吧)**這裡就不貼了,留給讀者自己思考。

NOI2013 矩陣遊戲

據學長的話來說 這是當年noi最簡單的一道題 於是抱著試一試的心態做了一做 蒟蒻qaq 由於矩陣乘法不會,只能數學必修的種數列知識推公式 先橫向推 f x k a f x 1 k 展開就可以得到乙個等比數列 然後根據等比數列的性質可得 fx ax 1 f1 b ax 1 1 a 1 至此我們完成了將...

NOI2013 矩陣遊戲

題意 對於乙個n行m列的矩陣,第i行第j列的元素為f i j 已知a,b,c,d,並且矩陣元素滿足 f 1 1 1 f i,j a f i j 1 b j 1 f i,1 c f i 1 m d i 1 求f n m 答案對1e9 7取模 1 n,m 1e1000000 1 a,b,c,d 1e9 ...

矩陣乘法 NOI2013 向量內積

兩個 d 維向量 a a1,a2,ad 與 b b1,b 2,bd 的內積為其相對應維度的權值的乘積和,即 a b i 1 daib i a1 b1 a 2b2 ad bd現在有 n 個 d維向量 x1 x2,xn 小喵喵想知道是否存在兩個向量的內積為 k 的倍數。請幫助她解決這個問題。第一行包含 ...