题意

题目链接

Sol

感觉做这题只要对矩阵乘法理解的稍微一点就能做出来
对于每一行构造一个矩阵
A = a 1
      0 b
列与列之间的矩阵为
B = c 1
      0 d
最终答案为
$A^{n - 1}B A^{n - 1}B \dots $
把$A^{n-1}B$看成一项进行快速幂即可


maya把数据范围看漏了1e6个0。。。。。。。

好像把快速幂换成十进制快速幂就行了

/*
感觉做这题只要对矩阵乘法理解的稍微一点就能做出来
对于每一行构造一个矩阵
A = a 1
0 b
列与列之间的矩阵为
B = c 1
0 d
最终答案为
$A^{n - 1}B A^{n - 1}B$
把$A^{n-1}B$看成一项进行快速幂即可 maya把数据范围看漏了1e6个0。。。。。。。 好像把快速幂换成十进制快速幂就行了
*/
#include<bits/stdc++.h>
#define LL long long
#define int long long
const int MAXN = 1e6 + , mod = 1e9 + , L = ;
using namespace std;
char t1[MAXN], t2[MAXN];
int N[MAXN], M[MAXN], a, b, c, d, n, m;
int Mod(int x, int y) {
if(1ll * x * y > mod) return 1ll * x * y % mod;
else return 1ll * x * y;
}
int add(int x, int y) {
if(x + y > mod) return x + y - mod;
else return x + y;
}
struct Matrix {
int m[][];
Matrix() {
memset(m, , sizeof(m));
}
Matrix operator * (const Matrix &rhs) const {
Matrix ans;
/*for(int k = 1; k <= L; k++)
for(int i = 1; i <= L; i++)
for(int j = 1; j <= L; j++)
(ans.m[i][j] += 1ll * m[i][k] * rhs.m[k][j] % mod) %= mod;*/
ans.m[][] = add(Mod(m[][], rhs.m[][]), Mod(m[][], rhs.m[][]));
ans.m[][] = add(Mod(m[][], rhs.m[][]), Mod(m[][], rhs.m[][]));
ans.m[][] = add(Mod(m[][], rhs.m[][]), Mod(m[][], rhs.m[][]));
ans.m[][] = add(Mod(m[][], rhs.m[][]), Mod(m[][], rhs.m[][]));
return ans;
}
};
Matrix fp(Matrix a, int *p, int len) {
Matrix base;
for(int i = ; i <= ; i++) base.m[i][i] = ;
for(int i = len; i >= ; i--) {
for(int j = ; j <= p[i]; j++) base = base * a;
Matrix tmp = a;
a = a * a; a = a * a; a = a * a; a = a * tmp * tmp;
}
return base;
}
int trans(char *s, int l, int *to) {
for(int i = ; i <= l; i++) to[i] = s[i] - '';
to[l]--;
for(int i = l; i >= ; i--)
if(to[i] < ) to[i - ] += to[i], to[i] = + to[i];
else break;
return l;
}
main() {
// freopen("a.in", "r", stdin);
scanf("%s%s%d%d%d%d", t1 + , t2 + , &a, &b, &c, &d);
n = strlen(t1 + ); m = strlen(t2 + );
n = trans(t1, n, N); m = trans(t2, m, M); Matrix x, y;
x.m[][] = a; x.m[][] = b;
x.m[][] = ; x.m[][] = ;
y.m[][] = c; y.m[][] = d;
y.m[][] = ; y.m[][] = ; Matrix debug = fp(x, M, m) ;
debug = debug * y;
Matrix ans = fp(debug, N, n);
ans = ans * fp(x, M, m);
cout << (ans.m[][] + ans.m[][]) % mod;
}

最新文章

  1. Linux启动报错missing operating system
  2. oracle去掉重复记录语句
  3. eclipse中 起动tomcat时报Multiple Contexts have a path of &quot;/shopping&quot;
  4. ES
  5. jsp语法与标签
  6. 设计模式之桥接模式(Bridge)--结构模型
  7. Javascript中的深拷贝和浅拷贝
  8. MySQL binlog 的恢复操作
  9. 自学传说中的php接口编写
  10. curl提交请求时,如何把cookie带过去
  11. 踏上编程大道 从 Python 开始成为神级 Coder
  12. Python:Day20 模块
  13. UNIX网络编程中的字节序问题
  14. nativefier - 快速把任意网页生成桌面应用程序
  15. python--json、jsonpath
  16. centos6.5上安装ftp服务
  17. 带你熟悉SQLServer2016中的System-Versioned Temporal Table 版本由系统控制的临时表
  18. Eclipse中已安装的插件如何卸载
  19. Linux上配置bond
  20. java基础-day23

热门文章

  1. R语言简单作图
  2. Luogu 3312 [SDOI2014]数表
  3. 6.7 安装ant
  4. SCUT - 337 - 岩殿居蟹 - 线段树 - 树状数组
  5. Java8 使用 stream().sorted()对List集合进行排序
  6. HDP3.1 中配置 YARN 的 timeline server 使用外部的 HBase
  7. 黑马SSM项目练习中的Oracle操作
  8. centos7 yum快速安装php7.1
  9. ACM 大神的经验加技巧(当然不是我的拉——
  10. Uva1608