Matrix_QP(A_2SeqSum)
题目大意:给出an,bn的递推,求ai*bi(i=0,1,……n-1)的和(an=a(n-1)*Ax+Ay, bn=b(n-1)*Bx+By, a0=A0, b0=B0, Ax,Bx,Ay,By已知)。
题解:矩阵快速幂不用说了,式子也好推,开了ll基本没有坑点,奇葩的是这题是做连通分量做到的,有丶意思。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 6;
const int MOD = 1e9 + 7;
ll A0, B0, Ax, Bx, Ay, By;
ll p, q, r, s;
struct M
{
ll mat[N];
M(){}
M( int _ )
{
mat[1] = A0*B0%MOD;
mat[2] = A0; mat[3] = B0;
mat[4] = 1;
mat[5] = A0*B0%MOD;
}
};
struct _M
{
ll mat[N][N];
_M(){}
_M( int _ )
{
mat[1][1] = p; mat[1][2] = q; mat[1][3] = r; mat[1][4] = s; mat[1][5] = 0;
mat[2][1] = mat[2][3] = mat[2][5] = 0; mat[2][2] = Ax%MOD; mat[2][4] = Ay%MOD;
mat[3][1] = mat[3][2] = mat[3][5] = 0; mat[3][3] = Bx%MOD; mat[3][4] = By%MOD;
mat[4][1] = mat[4][2] = mat[4][3] = mat[4][5] = 0; mat[4][4] = 1;
mat[5][1] = p; mat[5][2] = q; mat[5][3] = r; mat[5][4] = s; mat[5][5] = 1;
}
};
void init()
{
p = Ax*Bx%MOD;
q = Ax*By%MOD;
r = Bx*Ay%MOD;
s = Ay*By%MOD;
}
M M12( M a, _M b )
{
M c;
memset(c.mat,0,sizeof(c.mat));
for ( int i = 1; i < N; i ++ )
{
ll cur = 0;
for ( int j = 1; j < N; j ++ )
cur += (a.mat[j]%MOD*b.mat[i][j]%MOD)%MOD;
c.mat[i] = cur % MOD;
}
return c;
}
_M M22( _M a, _M b )
{
_M c;
memset(c.mat,0,sizeof(c.mat));
for ( int i = 1; i < N; i ++ )
{
for ( int j = 1; j < N; j ++ )
{
ll cur = 0;
for ( int k = 1; k < N; k ++ )
cur += (a.mat[i][k]%MOD*b.mat[k][j]%MOD)%MOD;
c.mat[i][j] = cur % MOD;
}
}
return c;
}
M qp( M a, _M b, ll c )
{
while ( c )
{
if ( c & 1 ) a = M12( a, b );
c >>= 1;
b = M22(b,b);
}
return a;
}
int main()
{
ll m;
while ( ~scanf("%lld", &m) )
{
scanf("%lld%lld%lld", &A0, &Ax, &Ay);
scanf("%lld%lld%lld", &B0, &Bx, &By);
if ( !m ) puts("0");
else if ( m == 1 )
{
ll now = A0%MOD*B0%MOD%MOD;
printf("%lld\n", now);
}
else
{
init();
M ans(1);
_M base(1);
/* for ( int i = 1; i < N; i ++)
cout << ans.mat[i] << endl;
for ( int i = 1; i < N; i ++ )
{
for ( int j = 1; j < N; j ++ )
cout << base.mat[i][j] << " ";
cout << endl;
}
*/
ans = qp( ans, base, m-1);
printf("%lld\n", (ans.mat[5]%MOD+MOD)%MOD);
}
}
return 0;
}
Matrix_QP(A_2SeqSum)的更多相关文章
随机推荐
- 一个I/O线程可以并发处理N个客户端连接和读写操作 I/O复用模型 基于Buf操作NIO可以读取任意位置的数据 Channel中读取数据到Buffer中或将数据 Buffer 中写入到 Channel 事件驱动消息通知观察者模式
Tomcat那些事儿 https://mp.weixin.qq.com/s?__biz=MzI3MTEwODc5Ng==&mid=2650860016&idx=2&sn=549 ...
- time-based DB
这类时间序列数据库最多,使用也最广泛.一般人们谈论时间序列数据库的时候指代的就是这一类存储.按照底层技术不同可以划分为三类. 直接基于文件的简单存储:RRD Tool,Graphite Whisper ...
- ES6中的let和const
let和const let 用来声明变量,但是所声明的变量只在let命令所在的代码块内有效 { let a=12 alert(a)//12 } alert(a)//报错 找不到 let不像var那样会 ...
- python学习笔记(二)— 字符串(string)
字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var2 ...
- UDP和TCP的主要特点
UDP的主要特点是:(1)无连接:(2)尽最大努力交付:(3)面向报文:(4)无拥塞控制:(5)支持一对一.一对多.多对一和多对多的交互通信:(6)首部开销小(只有四个字段:源端口.目的端口.长度.检 ...
- MySQL - 查询今天的数据(以及昨天、本月、上个月、今年...) 查询Datetime 时间的数据
1,查询当天(今天)的数据 1 SELECT * FROM `order` WHERE TO_DAYS(order_time) = TO_DAYS(NOW()) 2,查询昨天的数据 1 SELECT ...
- BS一机双屏的解决方式
一.WebSocket通讯 WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与server全双工通信. 为保证socket不间断.使用下面类库进行socket通讯. ht ...
- git提交到远程虚拟机
git到自己的虚拟机中第一步:打通git(一)Linux中(ip为10.1.8.1)1.安装git如:Ubuntu中安装gitapt install git 2.Ubuntu中添加git用户sudo ...
- Apache配置虚拟主机的三种方法(基于IP、端口、域名)
1 Apache虚拟主机的实现方式有3种. 基于IP的虚拟主机 基于端口的虚拟主机 基于域名的虚拟主机 2.1 启用虚拟主机的准备工作 2.1.1安装httpd [root@mail httpd]# ...
- 机器学习第2周---炼数成金-----线性回归与Logistic
重点归纳 回归分析就是利用样本(已知数据),产生拟合方程,从而(对未知数据)迚行预测用途:预测,判别合理性例子:利用身高预测体重:利用广告费用预测商品销售额:等等.线性回归分析:一元线性:多元线性:广 ...