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. git学习(7)标签管理

    git学习(7)标签管理 1. 建立标签 在发布版本时候,我们通常会在版本库中打一个标签,这样就唯一确定了打标签的版本,有点像个里程碑,这里会有一个指向某个commit的指针 打标签很简单,首先切换到 ...

  2. ctf-HITCON-2016-houseoforange学习

    目录 堆溢出点 利用步骤 创建第一个house,修改top_chunk的size 创建第二个house,触发sysmalloc中的_int_free 创建第三个house,泄露libc和heap的地址 ...

  3. Spark 源码分析 -- BlockStore

    BlockStore 抽象接口类, 关键get和put都有两个版本序列化, putBytes, getBytes非序列化, putValues, getValues 其中putValues的返回值为P ...

  4. Spark源码分析 -- PairRDD

    和一般RDD最大的不同就是有两个泛型参数, [K, V]表示pair的概念 关键的function是, combineByKey, 所有pair相关操作的抽象 combine是这样的操作, Turns ...

  5. 搭建SpringbootAdmin监控中心报错A attempt was made to call the method reactor.retry.Retry.retryMax(I)Lreactor/ret)

    遇到了同样的错误,转载记录下: 转载自:https://blog.csdn.net/qq_41938882/article/details/85048953   很明显,还没有启动成功就报错了.报错原 ...

  6. 解决Bat脚本中包含中文,运行乱码

    bat文件右键用“编辑” 打开, 另存为时,UTF-8保存为ANSI 格式.即可解决运行时乱码问题.

  7. notepad快捷键总结

    notepad快捷键总结 常用快捷键: 快捷键 功能1.Ctrl-D 复制当前行2.Ctrl-L 删除当前行3.Ctrl-T 把当前行和前面一行调换位置4.F11 切换全屏模式5.Ctrl-Shft- ...

  8. Linux打包压缩与安装卸载

     一.打包压缩 (1)tar:打包拆包命令 tar -cxzjvf 打包后的文件 欲打包的目录  -c:打包文件夹  -x:拆开文件夹  -z:以gzip格式压缩,默认压缩倍数为6倍  -j:以bzi ...

  9. JDK环境变量配置目录jre,jvm

    类路径 :CLASSPATH= .;%JAVA_HOME%/lib/dt.jar;%JAVA_HOME%/lib/tools.jar   JDK的路径:JAVA_HOME = C:/Program F ...

  10. AtCoder Regular Contest 080 D - Grid Coloring

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_b 题目: D - Grid Coloring Time limit : 2sec / Memory ...