hdu_4686

题目大意:给出an,bn的递推,求ai*bi(i=0,1,……n-1)的和(an=a(n-1)*Ax+Ay, bn=b(n-1)*Bx+Bya0=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)的更多相关文章

随机推荐

  1. 状态维持在web层 每层都可以Cache

    API网关的开源解决方案那么多,为什么我们却还要选择自研? - SDK.CN - 中国领先的开发者服务平台 https://sdk.cn/news/8001 技术细节Microservice+SOA状 ...

  2. jquery.easing的使用

    下载地址:http://www.jb51.net/jiaoben/32922.html 基本语法:easing:格式为json,{duration:持续时间,easing:过渡效果,complete: ...

  3. Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.minor version 52.0 解决办法

    Exception in thread "main" java.lang.UnsupportedClassVersionError: * : Unsupported major.m ...

  4. Android技巧小结之新旧版本Notification

    最近开发用到了通知功能,但有几个地方老是提示deprecated,然后就找了篇文章学习了下新旧版本的不同. Notification即通知,用于在通知栏显示提示信息. 在较新的版本中(API leve ...

  5. 手动编译安装Libvirt之后利用systemctl管理libvirtd服务

    因为要给特殊的虚拟机关联文件指定selinux标签,而默认的Libvirt没有这个功能,所以需要修改LIbvirt源代码,重新编译安装Libvirt,而手动编译安装的LIbvirt,没有办法使用sys ...

  6. MyEclipse 10的使用技巧

    默认快捷键 :Shift+Alt+s 然后选择generater getter and setter,这是快捷键.或者右键source里边有 generater getter and setter. ...

  7. Pytorch permute,contiguous

    permute(dims),常用的维度转换方法 将tensor的维度换位      参数:dim(int)---换位顺序 >>>x = torch.randn(,,) >> ...

  8. spring MVC中的异常统一处理

    1.spring MVC中定义了一个标准的异常处理类SimpleMappingExceptionResolver 该类实现了接口HandlerExceptionResolver 2.看下SimpleM ...

  9. 【zabbix】自定义监控项key值

    说明: zabbix自带的默认模版里包括了很多监控项,有时候为了满足业务需求,需要根据自己的监控项目自定义监控项,这里介绍一种自定义监控项的方式. 1,首先编写自定义监控脚本,本文以监控httpd进程 ...

  10. 使用python操作文件实现购物车程序

    使用python操作文件实现购物车程序 题目要求如下: 实现思路 始终维护一张字典,该字典里保存有用户账号密码,购物车记录等信息.在程序开始的时候读进来,程序结束的时候写回文件里去.在登录注册的部分, ...