矩阵加速

  • 数学作业
    • description
    • solution
    • code
  • Arc of Dream
    • description
    • solution
    • code

数学作业

description

solution

dpdpdp状态转移方程,dpi=dpi−1∗10leni+i(modM)dp_{i}=dp_{i-1}*10^{len_i}+i\pmod Mdpi​=dpi−1​∗10leni​+i(modM)

nnn巨大,分段矩阵加速
[fi−1i−11]×[10len00110111]=[fii1]\begin{bmatrix} f_{i-1}&i-1&1 \end{bmatrix} \times \begin{bmatrix} 10^{len}&0&0\\ 1&1&0\\ 1&1&1 \end{bmatrix}= \begin{bmatrix} f_{i}&i&1 \end{bmatrix} [fi−1​​i−1​1​]×⎣⎡​10len11​011​001​⎦⎤​=[fi​​i​1​]

code

#include <cmath>
#include <cstdio>
#include <cstring>
#define int long long
int n, mod;
int mi[20];
struct matrix {int n, m;int c[3][3];matrix() {n = m = 0;memset( c, 0, sizeof( c ) );}matrix operator * ( matrix &t ) {matrix ans;ans.n = n, ans.m = t.m;for( int i = 0;i <= n;i ++ )for( int j = 0;j <= t.m;j ++ )for( int k = 0;k <= m;k ++ )ans.c[i][j] = ( ans.c[i][j] + c[i][k] * t.c[k][j] % mod ) % mod;return ans;}
}fast, ret;matrix qkpow( matrix x, int y ) {if( ! y ) return x;matrix ans;ans.n = ans.m = 2;for( int i = 0;i <= 2;i ++ )ans.c[i][i] = 1;while( y ) {if( y & 1 ) ans = ans * x;x = x * x;y >>= 1;}return ans;
}signed main() {scanf( "%lld %lld", &n, &mod );mi[0] = 1;for( int i = 1;i <= 18;i ++ )mi[i] = mi[i - 1] * 10;ret.n = 0, ret.m = 2, ret.c[0][2] = 1;fast.n = fast.m = 2;for( int i = 1;;i ++ ) {memset( fast.c, 0, sizeof( fast.c ) );fast.c[0][0] = mi[i] % mod;fast.c[1][0] = fast.c[1][1] = fast.c[2][0] = fast.c[2][1] = fast.c[2][2] = 1;if( pow( 10, i ) <= n )fast = qkpow( fast, mi[i - 1] * 9 );elsefast = qkpow( fast, n - mi[i - 1] + 1 );ret = ret * fast;if( mi[i] > n ) break;}printf( "%lld\n", ret.c[0][0] % mod );return 0;
}

Arc of Dream

description

solution

AoD(n)=AoD(n−1)+an−1bn−1=AoD(n−1)+(an−2∗AX+AY)(bn−2∗BX+BY)AoD(n)=AoD(n-1)+a_{n-1}b_{n-1}=AoD(n-1)+(a_{n-2}*AX+AY)(b_{n-2}*BX+BY)AoD(n)=AoD(n−1)+an−1​bn−1​=AoD(n−1)+(an−2​∗AX+AY)(bn−2​∗BX+BY)

=AoD(n−1)+an−2bn−2AXBX+an−2AXBY+bn−2BXAY+AYBY=AoD(n-1)+a_{n-2}b_{n-2}AXBX+a_{n-2}AXBY+b_{n-2}BXAY+AYBY=AoD(n−1)+an−2​bn−2​AXBX+an−2​AXBY+bn−2​BXAY+AYBY

满满的矩阵味道,赤裸裸的系数暗示

[AoD(i)ai−1bi−1ai−1bi−1AYBYAYBY]×[1000000AXBXAXBX00000AXAXAX0000BXBX0BX000110010011100101101001]∣∣[AoD(i+1)aibiaibiAYBYAYBY]\begin{bmatrix} AoD(i)&a_{i-1}b_{i-1}&a_{i-1}&b_{i-1}&AYBY&AY&BY \end{bmatrix} \\ \times \\ \begin{bmatrix} 1&0&0&0&0&0&0\\ AXBX&AXBX&0&0&0&0&0\\ AX&AX&AX&0&0&0&0\\ BX&BX&0&BX&0&0&0\\ 1&1&0&0&1&0&0\\ 1&1&1&0&0&1&0\\ 1&1&0&1&0&0&1\\ \end{bmatrix} \\ || \\ \begin{bmatrix} AoD(i+1)&a_ib_i&a_i&b_i&AYBY&AY&BY \end{bmatrix} [AoD(i)​ai−1​bi−1​​ai−1​​bi−1​​AYBY​AY​BY​]×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡​1AXBXAXBX111​0AXBXAXBX111​00AX0010​000BX001​0000100​0000010​0000001​⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤​∣∣[AoD(i+1)​ai​bi​​ai​​bi​​AYBY​AY​BY​]

code

#include <cstdio>
#include <cstring>
#define int long long
#define mod 1000000007
struct matrix {int n, m;int c[8][8];matrix() {n = m = 0;memset( c, 0, sizeof( c ) );}matrix operator * ( matrix &t ) {matrix ans;ans.n = n, ans.m = t.m;for( int i = 1;i <= n;i ++ )for( int j = 1;j <= t.m;j ++ )for( int k = 1;k <= m;k ++ )ans.c[i][j] = ( ans.c[i][j] + c[i][k] * t.c[k][j] ) % mod;return ans;}
}g, ret;matrix qkpow( matrix x, int y ) {matrix ans;ans.n = x.n, ans.m = x.m;for( int i = 1;i <= ans.n;i ++ )ans.c[i][i] = 1;while( y ) {if( y & 1 ) ans = ans * x;x = x * x;y >>= 1;}return ans;
}signed main() {int n, A0, AX, AY, B0, BX, BY;while( ~ scanf( "%lld %lld %lld %lld %lld %lld %lld", &n, &A0, &AX, &AY, &B0, &BX, &BY ) ) {g.n = g.m = ret.m = 7, ret.n = 1;if( ! n ) {printf( "0\n" );continue;}if( n == 1 ) {printf( "%lld\n", A0 * B0 % mod );continue;}memset( g.c, 0, sizeof( g.c ) );memset( ret.c, 0, sizeof( ret.c ) );ret.c[1][1] = ret.c[1][2] = A0 * B0 % mod;ret.c[1][3] = A0, ret.c[1][4] = B0;ret.c[1][5] = AY * BY % mod;ret.c[1][6] = AY, ret.c[1][7] = BY;g.c[1][1] = g.c[5][1] = g.c[5][2] = g.c[6][3] = g.c[7][4] = g.c[5][5] = g.c[6][6] = g.c[7][7] = 1;g.c[2][1] = g.c[2][2] = AX * BX % mod;g.c[3][1] = g.c[3][2] = AX * BY % mod;g.c[4][1] = g.c[4][2] = AY * BX % mod;g.c[3][3] = AX, g.c[4][4] = BX;g = qkpow( g, n - 1 );ret = ret * g;printf( "%lld\n", ret.c[1][1] );}return 0;
}

HH去散步

之前已经写过博客了,不再赘述

线性代数二之矩阵加速DP——数学作业,Arc of Dream相关推荐

  1. 【codevs2304】【BZOJ1875】HH去散步,第一次的矩阵加速DP

    传送门1 传送门2 写在前面:今天冒傻气 思路:我第一眼没有看出来它是个矩阵乘法加速DP,只觉得如果这个t小点就直接广搜可以了,后来发现网上的题解无一例外都是矩阵快速幂的时候,我的表情 后来看了看黄学 ...

  2. [矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

    矩阵快速幂习题 复习矩阵乘法及快速幂模板 乘法模板 快速幂模板 T1:Arc of Dream 题目 题解 code T2:Recursive sequence 题目 题解 code T3:233 M ...

  3. [ZJOI2011]细胞——斐波那契数列+矩阵加速+dp

    Description bzoj2323 Solution 题目看起来非常复杂. 本质不同的细胞这个条件显然太啰嗦, 是否有些可以挖掘的性质? 1.发现,只要第一次分裂不同,那么互相之间一定是不同的( ...

  4. 【BZOJ1009】【codevs2325】GT考试,kmp+矩阵加速DP

    传送门1 传送门2 写在前面:卡了我一下午的题目,讨厌矩阵乘法! 思路: 一开始觉得是kmp+容斥,想用累似数位DP的方法做,但发现讨论的东西有点麻烦,而且这样做是线性O(n)O(n)且貌似不能优化, ...

  5. 漫步线性代数二十七——矩阵对角化

    现在我们开始实质性的计算,它非常简单并且在随后的几篇文章里都会用到.特征向量对角化一个矩阵: 3.假设n×nn\times n矩阵有nn个线性无关的特征向量,如果这些向量是矩阵SS的列,那么S−1AS ...

  6. 【BZOJ2326】【HNOI2011】数学作业 [矩阵乘法][DP]

    数学作业 Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Description Input 输入文件只有一行为用 ...

  7. 线性代数四之动态DP(广义矩阵加速)——Can you answer these queries III,保卫王国

    动态DP--广义矩阵加速 SP1716 GSS3 - Can you answer these queries III description solution code [NOIP2018 提高组] ...

  8. 线性代数三之状压DP的矩阵加速——Quad Tiling,Bus公交线路

    状压与矩阵加速的藕断丝连 Quad Tiling description solution code [Hnoi2010]Bus 公交线路 description solution code Quad ...

  9. BZOJ 2326: [HNOI2011]数学作业( 矩阵快速幂 )

    BZOJ先剧透了是矩阵乘法...这道题显然可以f(x) = f(x-1)*10t+x ,其中t表示x有多少位. 这个递推式可以变成这样的矩阵...(不会用公式编辑器...), 我们把位数相同的一起处理 ...

最新文章

  1. PXE+kickstart自动安装ubuntu14.04
  2. CentOS7.2中安装rabbitmq
  3. 算法题存档20190206
  4. java 后台跳出提示_小猿圈Java初学者练习小案例:猜数字游戏
  5. 【网络安全工程师面试合集】— 网络攻防技术演化历程
  6. 开源GIS(十)——openlayers中加载在线标准与自定义切片
  7. python基础教程是什么-python基础教程之python是什么?
  8. mysql 更新删除数据,MYSQL数据的插入、删除、更新
  9. 解密Cocos2D中的Lua源码
  10. 教育培训机构小程序开发需求有哪些?
  11. show-busy-java-threads
  12. 易企秀手机html5场景源码,仿易企秀V15.1手机网页DIY制作工具完整版开源版源码修复采......
  13. linux SQL2019 代理SQLServerAgent is not currently running so it cannot be notified of this action
  14. Make 命令零基础教程
  15. storyboard搭建项目_Storyboard
  16. led台灯哪个牌子质量好?2022最新的台灯牌子排名
  17. 英语不好,英语不好真的可以学编程吗?亲身经历告诉你
  18. 周志华-机器学习(神经网络)
  19. 宝宝生活点滴(2009.11)
  20. 直击2016百分点数据与价值国际论坛:这些大咖都讲什么呢?

热门文章

  1. oracle执行命令显示2,Oracle数据库执行脚本常用命令小结
  2. ensp查看历史配置命令_华为eNSP常用命令
  3. python姓名输出语句_Python最基本的输入输出详解
  4. python程序设计实践教程陈东_Python
  5. java 创建以太坊代币_以太坊 (五)编写智能合约-建立简易加密代币
  6. 服务器运行慢都有哪些问题,服务器数据库的运行速度很慢问题
  7. java十六进制大小端转换_字节顺序
  8. c语言中二重指针如何赋值,关于二重指针释放的有关问题
  9. 中南民族大学计算机图像处理实验报告,中南民族大学数字图像处理程序及图像...
  10. Android 调用12306接口,GitHub - AndroidyxChen/loading-12306: 仿PC端12306的刷新loading的自定义view...