[BZOJ3240][NOI2013]矩阵游戏(数论+矩乘)
来源:互联网 发布:城市网络交换平台 编辑:程序博客网 时间:2024/05/23 00:01
可以发现,对于任意一个
从
先考虑快速求得
考虑压缩。根据费马小定理,容易得到:
由于
再考虑快速求得
在
边界矩阵
此时
在
首先用上面的方法求出
可以得出,
而对于
到这里就已经求出了
继续可以发现,
代码:
#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;inline int read() { int res = 0; bool bo = 0; char c; while (((c = getchar()) < '0' || c > '9') && c != '-'); if (c == '-') bo = 1; else res = c - 48; while ((c = getchar()) >= '0' && c <= '9') res = (res << 3) + (res << 1) + (c - 48); return bo ? ~res + 1 : res;}const int N = 1e6 + 5, PYZ = 1e9 + 7;int n, m, a, b, c, d, x1[N], x2[N];char s1[N], s2[N];int Mod(int &len, int *x, int LPF) { int i, res = 0, tmp; for (i = len; i; i--) { tmp = res; res = (10ll * res + 1ll * x[i]) % LPF; x[i] = (10ll * tmp + 1ll * x[i]) / LPF; } while (len > 1 && !x[len]) len--; return res;}struct cyx { int m, n, v[6][6]; cyx() {} cyx(int _m, int _n) : m(_m), n(_n) {memset(v, 0, sizeof(v));} friend inline cyx operator * (cyx a, cyx b) { cyx res = cyx(a.m, b.n); int i, j, k; for (i = 1; i <= res.m; i++) for (j = 1; j <= res.n; j++) for (k = 1; k <= a.n; k++) (res.v[i][j] += 1ll * a.v[i][k] * b.v[k][j] % PYZ) %= PYZ; return res; } friend inline cyx operator ^ (cyx a, int b) { cyx res = cyx(a.m, a.n); int i; for (i = 1; i <= res.m; i++) res.v[i][i] = 1; while (b) { if (b & 1) res = res * a; a = a * a; b >>= 1; } return res; }};int qpow(int a, int b) { int res = 1; while (b) { if (b & 1) res = 1ll * res * a % PYZ; a = 1ll * a * a % PYZ; b >>= 1; } return res;}int sumPYZ(int a, int b) { if (b == 0) return 0; if (b == 1) return a; cyx P = cyx(3, 3), Q = cyx(3, 1), F; P.v[1][1] = P.v[1][3] = a; P.v[2][1] = P.v[3][3] = 1; Q.v[1][1] = a; Q.v[2][1] = Q.v[3][1] = 1; F = (P ^ (b - 1)) * Q; return F.v[1][1];}int main() { int i, u, v, dx, dy, e, f, kx, ky; scanf("%s", s1 + 1); scanf("%s", s2 + 1); n = strlen(s1 + 1); m = strlen(s2 + 1); for (i = 1; i <= n; i++) x1[i] = s1[n - i + 1] - 48; for (i = 1; i <= m; i++) x2[i] = s2[m - i + 1] - 48; u = Mod(n, x1, PYZ - 1); v = Mod(m, x2, PYZ - 1); a = read(); b = read(); c = read(); d = read(); dx = qpow(a, (v - 2 + PYZ) % (PYZ - 1)); int tmp = sumPYZ(a, PYZ - 1); dy = sumPYZ(a, v) + 1; tmp = 1ll * tmp * Mod(m, x2, PYZ) % PYZ; (dy += tmp) %= PYZ; dy = (dy - qpow(a, v + PYZ - 1) + PYZ) % PYZ; dy = (dy - qpow(a, v + PYZ - 2) + PYZ) % PYZ; dy = 1ll * dy * b % PYZ; e = 1ll * dx * c % PYZ; f = (1ll * dy * c % PYZ + d) % PYZ; kx = qpow(e, (u - 2 + PYZ) % (PYZ - 1)); tmp = sumPYZ(e, PYZ - 1); ky = sumPYZ(e, u) + 1; tmp = 1ll * tmp * Mod(n, x1, PYZ) % PYZ; (ky += tmp) %= PYZ; ky = (ky - qpow(e, u + PYZ - 1) + PYZ) % PYZ; ky = (ky - qpow(e, u + PYZ - 2) + PYZ) % PYZ; ky = 1ll * ky * f % PYZ; int res = (kx + ky) % PYZ; res = (1ll * res * dx % PYZ + dy) % PYZ; cout << res << endl; return 0;}
阅读全文
0 0
- [BZOJ3240][NOI2013]矩阵游戏(数论+矩乘)
- BZOJ3240: [Noi2013]矩阵游戏
- bzoj3240: [Noi2013]矩阵游戏
- [题解]bzoj3240(NOI2013)矩阵游戏
- bzoj3240: [Noi2013]矩阵游戏(矩阵乘法+快速幂)
- [BZOJ3240][Noi2013]矩阵游戏 && 快速幂
- NOI2013 矩阵游戏 【数论】
- bzoj3240 noi2013矩形游戏
- 3240: [Noi2013]矩阵游戏
- 【NOI2013】矩阵游戏
- [NOI2013]矩阵游戏
- NOI2013矩阵游戏
- [NOI2013]矩阵游戏(矩阵乘法+十进制快速幂)
- bzoj 3240 [Noi2013]矩阵游戏
- bzoj 3240: [Noi2013]矩阵游戏
- [bzoj 3240--Noi2013]矩阵游戏
- 【矩阵+十进制快速幂】[NOI2013]矩阵游戏
- BZOJ 3240 [Noi2013] 矩阵游戏 题解
- 数论--高斯消元法
- Ubuntu使用的一些总结
- hiho 166 逃离迷宫
- Restful形式接口文档生成之Swagger与SpringMVC整合手记
- 【GIT】本地git链接到github
- [BZOJ3240][NOI2013]矩阵游戏(数论+矩乘)
- 利用CVE-2016-0189漏洞进行流氓软件推广
- Qt5 connect新语法:Lambda表达式
- Linux信号简单入门
- 实例4-5 实现联动打的下拉列表DropDownList控件
- Ruby简介
- Pspice元件库说明
- vuex
- 小希的迷宫(第二次遇到了)