婷婷是個喜歡矩陣的小朋友,有一天她想用電腦生成乙個巨大的
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 6output
85explanation
樣例中的矩陣為:⎛⎝
⎜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 轉...