[NOI2013]矩阵游戏 解题报告

[NOI2013]矩阵游戏 解题报告

这题怎么这么多人用矩乘做啊。。。

所以我还是在下面附上这道题的“矩乘”费马小定理吧。(其实这个性质极其特殊)

题目链接

P1397 矩阵游戏 - 洛谷

题目大意

已知

F ( 1 , 1 ) = 1 ; F(1,1)=1; F(1,1)=1;

F ( i , j ) = a F ( i , j − 1 ) + b ( 2 ≤ j ≤ m ) F(i,j)=aF(i,j-1)+b(2\le j\le m) F(i,j)=aF(i,j1)+b(2jm)

F ( i , 1 ) = c F ( i − 1 , m ) + d ( 2 ≤ i ≤ n ) F(i,1)=cF(i-1,m)+d(2\le i\le n) F(i,1)=cF(i1,m)+d(2in)

F ( n , m )   m o d   ( 1 0 9 + 7 ) F(n,m)\bmod (10^9+7) F(n,m)mod(109+7)的值

  • 1 ≤ n , m ≤ 1 0 1   000   000 ; 1 ≤ a , b , c , d ≤ 1 0 9 1\le n,m\le 10^{1\ 000\ 000};1\le a,b,c,d\le 10^9 1n,m101 000 000;1a,b,c,d109

解题报告

问题分析

看到这题的时候,我就觉得这就是个高中数学数列题,结果它的确是。(尽管它非常毒瘤)

显然根据数学知识,先要分 a a a是否为1来考虑这个问题。这里我就推推 a ≠ 1 a\ne 1 a=1的情况。

思路是 F ( i , 1 ) → F ( i , m ) → F ( i + 1 , 1 ) F(i,1)\to F(i,m)\to F(i+1,1) F(i,1)F(i,m)F(i+1,1)

然后 F ( 1 , 1 ) → F ( n , 1 ) F(1,1)\to F(n,1) F(1,1)F(n,1)

最后再 F ( n , 1 ) → F ( n , m ) F(n,1)\to F(n,m) F(n,1)F(n,m)

具体推导如下

F ( i , j ) = a F ( i , j − 1 ) + b F(i,j)=aF(i,j-1)+b F(i,j)=aF(i,j1)+b

特征方程为 x = a x + b x=ax+b x=ax+b,特征根为 x = − b a − 1 x=-\dfrac{b}{a-1} x=a1b

于是

F ( i , j ) + b a − 1 = a [ F ( i , j − 1 ) + b a − 1 ] F(i,j)+\dfrac{b}{a-1}=a[F(i,j-1)+\dfrac{b}{a-1}] F(i,j)+a1b=a[F(i,j1)+a1b]

F ( i , m ) = a m − 1 [ F ( i , 1 ) + b a − 1 ] − b a − 1 ⋯ ( α ) F(i,m)=a^{m-1}[F(i,1)+\dfrac{b}{a-1}]-\dfrac{b}{a-1}\cdots (\alpha) F(i,m)=am1[F(i,1)+a1b]a1b(α)

故而

F ( i , 1 ) = c F ( i − 1 , m ) + d F(i,1)=cF(i-1,m)+d F(i,1)=cF(i1,m)+d

= a m − 1 c ⋅ F ( i − 1 , 1 ) + a m − 1 b c a − 1 − b c a − 1 + d =a^{m-1}c\cdot F(i-1,1)+\dfrac{a^{m-1}bc}{a-1}-\dfrac{bc}{a-1}+d =am1cF(i1,1)+a1am1bca1bc+d

= A ⋅ F ( i − 1 , 1 ) + B =A\cdot F(i-1,1)+B =AF(i1,1)+B

其中 A = a m − 1 c ≠ 1 , B = a m − 1 b c a − 1 − b c a − 1 + d A=a^{m-1}c\ne 1,B=\dfrac{a^{m-1}bc}{a-1}-\dfrac{bc}{a-1}+d A=am1c=1,B=a1am1bca1bc+d

再像一开始那样推就可以推得

F ( n , 1 ) = A n − 1 [ 1 + B A − 1 ] − B A − 1 ⋯ ( β ) F(n,1)=A^{n-1}[1+\dfrac{B}{A-1}]-\dfrac{B}{A-1}\cdots (\beta) F(n,1)=An1[1+A1B]A1B(β)

能够求得 F ( n , 1 ) F(n,1) F(n,1)

再把 F ( n , 1 ) F(n,1) F(n,1)代入 ( α ) (\alpha) (α)式中即可得 F ( n , m ) F(n,m) F(n,m)

另外由于 n , m n,m n,m巨大,要使用欧拉定理转化:

a n ≡ a n   m o d   ( P − 1 ) ( m o d P ) a^n\equiv a^{n \bmod (P-1)}\pmod P ananmod(P1)(modP)


告一段落。另外还有一种 a = 1 a=1 a=1的情况理应特殊考虑。(然而我脑残还考虑了 c c c是不是1,分了四种情况)

代码实现

//...
const ll P = 1e9 + 7;
const int MAXB = 1e6 + 5;
char n[MAXB], m[MAXB];
ll a, b, c, d;
ll calc(char a[], ll mod) {
	ll ans = 0; int len = strlen(a);
	for(int i = 0; i < len; i++) {//from hign to low
		ans = (ans * 10 + a[i] - '0') % mod;
	}
	return ans;
}
ll qpow(ll a, ll n) {
	ll ret = 1;
	for(; n; n >>= 1, (a *= a) %= P)
		if(n & 1) (ret *= a) %= P;
	return ret;
}
void solve1() {//a=c=1
	ll t1 = calc(n, P); ll t2 = calc(m, P);
	t1--; if(t1 < 0) t1 += P;
	t2--; if(t2 < 0) t2 += P;
	ll ans = (1 + (t2 * b % P + d) % P * t1 % P + t2 * b % P) % P;
	printf("%lld\n", ans);
}
ll calcFn1(ll A, ll B) {
	ll t3 = calc(n, P-1);
	t3--; if(t3 < 0) t3 += P-1;
	return ((qpow(A-1, P-2) * B + 1)% P * qpow(A, t3) % P + P - qpow(A-1, P-2) * B % P) % P;//F(n,1)
}
void solve2() {//a=1,c!=1
	ll t2 = calc(m, P);
	t2--; if(t2 < 0) t2 += P;
	ll A = c, B = (b * c % P * t2 % P + d) % P;
	ll tmp = calcFn1(A, B);//F(n,1)
	ll ans = (tmp + t2 * b % P) % P;
	printf("%lld\n", ans);
}
void solve3() {//a!=1, c=1
	ll t4 = calc(m, P-1); 
	t4--; if(t4 < 0) t4 += P-1;
	ll A = qpow(a, t4), B = ((A * b % P * qpow(a-1, P-2) % P + d) % P + P - qpow(a-1, P-2) * b % P) % P;
	ll tmp = calcFn1(A, B);
	ll ans = ((tmp + qpow(a-1, P-2) * b % P) * qpow(a, t4) % P + P - qpow(a-1, P-2) * b % P) % P;
	printf("%lld\n", ans);
}
void solve4() {//a!=1, c!=1
	ll t4 = calc(m, P-1);
	t4--; if(t4 < 0) t4 += P-1;
	ll A = qpow(a, t4) * c % P, B = ((A * b % P * qpow(a-1, P-2) % P + d) % P + P - b * c % P * qpow(a-1, P-2) % P) % P;
	ll tmp = calcFn1(A, B);
	ll ans = ((tmp + b * qpow(a-1, P-2) % P) % P * qpow(a, t4) % P + P - b * qpow(a-1, P-2) % P) % P;
	printf("%lld\n", ans);
}
int main() {
	scanf("%s%s", n, m);
	a = read(), b = read(), c = read(), d = read();
	if(a == 1 && c == 1) solve1();
	else if(a == 1 && c != 1) solve2();
	else if(a != 1 && c == 1) solve3();
	else solve4();
	return 0;
}

关于矩乘的“费马小定理”

这其实是这个题目的一个特殊性质。。。

a ≠ 1 a\ne 1 a=1时,有

( a b 0 1 ) P − 1 = ( a P − 1 ( a P − 2 + ⋯ + a + 1 ) b 0 1 ) \begin{pmatrix}a & b\\ 0 & 1\end{pmatrix}^{P-1}=\begin{pmatrix}a^{P-1} & (a^{P-2}+\cdots+a+1)b\\0 & 1\end{pmatrix} (a0b1)P1=(aP10(aP2++a+1)b1)

由费马小定理

a P − 1 ≡ 1 ( m o d P ) a^{P-1}\equiv 1\pmod P aP11(modP)

( a P − 2 + ⋯ + a + 1 ) ≡ 1 − a P − 1 1 − a ≡ 0 ( m o d P ) (a^{P-2}+\cdots+a+1)\equiv\dfrac{1-a^{P-1}}{1-a}\equiv 0 \pmod P (aP2++a+1)1a1aP10(modP)

所以 ( a b 0 1 ) P − 1 \begin{pmatrix}a & b\\ 0 & 1\end{pmatrix}^{P-1} (a0b1)P1在做   m o d   P \bmod P modP运算时就相当于单位矩阵 E 2 E_2 E2

完结撒花

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

日居月诸Rijuyuezhu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值