[NOI2013]矩阵游戏 解题报告
这题怎么这么多人用矩乘做啊。。。
所以我还是在下面附上这道题的“矩乘”费马小定理吧。(其实这个性质极其特殊)
题目链接
题目大意
已知
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,j−1)+b(2≤j≤m)
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(i−1,m)+d(2≤i≤n)
求 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 1≤n,m≤101 000 000;1≤a,b,c,d≤109
解题报告
问题分析
看到这题的时候,我就觉得这就是个高中数学数列题,结果它的确是。(尽管它非常毒瘤)
显然根据数学知识,先要分 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,j−1)+b
特征方程为 x = a x + b x=ax+b x=ax+b,特征根为 x = − b a − 1 x=-\dfrac{b}{a-1} x=−a−1b
于是
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)+a−1b=a[F(i,j−1)+a−1b]
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)=am−1[F(i,1)+a−1b]−a−1b⋯(α)
故而
F ( i , 1 ) = c F ( i − 1 , m ) + d F(i,1)=cF(i-1,m)+d F(i,1)=cF(i−1,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 =am−1c⋅F(i−1,1)+a−1am−1bc−a−1bc+d
= A ⋅ F ( i − 1 , 1 ) + B =A\cdot F(i-1,1)+B =A⋅F(i−1,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=am−1c=1,B=a−1am−1bc−a−1bc+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)=An−1[1+A−1B]−A−1B⋯(β)
能够求得 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 an≡anmod(P−1)(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)P−1=(aP−10(aP−2+⋯+a+1)b1)
由费马小定理
a P − 1 ≡ 1 ( m o d P ) a^{P-1}\equiv 1\pmod P aP−1≡1(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 (aP−2+⋯+a+1)≡1−a1−aP−1≡0(modP)
所以 ( a b 0 1 ) P − 1 \begin{pmatrix}a & b\\ 0 & 1\end{pmatrix}^{P-1} (a0b1)P−1在做 m o d P \bmod P modP运算时就相当于单位矩阵 E 2 E_2 E2!
完结撒花