bzoj 3240 Noi2013 矩陣遊戲

2021-08-08 21:36:52 字數 1166 閱讀 6480

有乙個巨大的n行m列的矩陣。這個矩陣滿足乙個神奇的性質:若用f[i][j]來表示矩陣中第i行第j列的元素,則f[i][j]滿足下面的遞推式:

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)

遞推式中a,b,c,d都是給定的常數。

現在問你f[n][m]的值是多少。由於最終結果可能很大,你只需要輸出f[n][m]除以1,000,000,007的餘數。

這道題的資料範圍是在我做過的題中是比較大的,n和m<=10^1000000,所以做法肯定不一般。首先我們講一下50分的做法,就是矩陣乘法加快速冪。這道題構造難度中等,首先構造出pre1為,pre2為,為什麼,看。接下來,定義ans一開始為per1^(m-1)(用快速冪求),讓ans*(第乙個1表示f[1][1]),那就可以得到,然後令ans=ans*pre2。因為ans * =(pre2*=),所以只需讓ans^(n-1)乘=,答案就出來了,50分的做法就是這樣。

現在講一下100分的做法,只需在50分的基礎上加上牛掰的費馬小定理就可以了。費馬小定理簡單可以理解為a^(p-1)≡1 (mod p),所以可以把n,m的超大範圍簡化成10^9。但是需要特判一下題目中a,c都為1的情況。這題在經過這樣的過程後,便解決了。

#include

#include

#include

#include

#include

#define mod 1000000007

using

namespace

std;

typedef

long

long ll;

struct node

};node pre1,pre2,f,ans;

node chengfa1(node a,node b)}}

return c;

}node chengfa2(node a,node b)

}return c;

}node power(int x,node pre)

return ans;

}char s1[1100000],s2[1100000];

int main()

BZOJ3240 Noi2013 矩陣遊戲

婷婷是個喜歡矩陣的小朋友,有一天她想用電腦生成乙個巨大的n行m列的矩陣 你不用擔心她如何儲存 她生成的這個矩陣滿足乙個神奇的性質 若用f i j 來表示矩陣中第i行第j列的元素,則f i j 滿足下面的遞推式 f 1 1 1 f i,j a f i j 1 b j 1 f i,1 c f i 1 m...

BZOJ 3240 Noi2013 矩陣遊戲

給出 n,m 1 le n,m le 10 求 f n,m mod 10 9 7 begin f 1,1 1 f i,1 cf i 1,m d f i,j af i,j 1 b j neq 1 end 其中 1 le a,b,c,d le 10 9 對於遞推式 f i af b 當 a 1 時通項為...

bzoj 3243 Noi2013 向量內積

兩個d 維向量a a1,a2,ad 與b b1,b2,bd 的內積為其相對應維度的權值的乘積和,即 現有 n 個d 維向量x1,xn 小喵喵想知道是否存在兩個向量的內積為k的倍數。請幫助她解決這個問題 首先做乙個轉換 如果把 b a a t 構造出來,那麼 b i j 就代表向量 i 和向量 j 的...