HDU 1757,1575,2604,2256 矩阵快速幂总结

2024-06-08 23:48

本文主要是介绍HDU 1757,1575,2604,2256 矩阵快速幂总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HDU 1757:

就是由f(x)可以得出矩阵……可以得到下面的a0到a9并上有1,0的矩阵,与f0到f9相乘一次可以得到f1到f10,所以^(k-9)次就可以得到fn-9到fn了,第一行就是f(k)……


这个图来自:http://www.cnblogs.com/wally/archive/2013/03/01/2938305.html

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 10000005
#define MN 3005
//#define INF 1000000007
#define eps 1e-7
using namespace std;
typedef long long ll;
#define Max 10
int INF;
struct Matrix //快速幂模板
{int m[Max][Max];Matrix() {}friend Matrix operator*(Matrix &m1,Matrix &m2){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++){temp.m[i][j]=0;for(k=0;k<Max;k++)temp.m[i][j]+=(m1.m[i][k]*m2.m[k][j])%INF;temp.m[i][j]%=INF;}return temp;}friend Matrix quickpow(Matrix &M,int n){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++) //单位矩阵if(i==j) temp.m[i][j]=1;else temp.m[i][j]=0;while(n){if(n&1) temp=temp*M;n>>=1;M=M*M;}return temp;}
};
int main()
{int m,k;while(~scanf("%d%d",&k,&m)){int i,j=9,sum=0;INF=m;Matrix res;mem(res.m,0);for(i=0;i<10;i++)scanf("%d",&res.m[0][i]);if(k<10) {pri(k%m);continue;}for(i=1;i<10;i++)res.m[i][i-1]=1;res=quickpow(res,k-9);for(i=0;i<10;i++)sum=(sum+res.m[0][i]*(j--))%m;pri(sum);}return 0;
}

HDU 1575:

先求幂后再求主对角线的和。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 10000005
#define Max 10
#define INF 9973
#define eps 1e-7
using namespace std;
typedef long long ll;
struct Matrix //快速幂模板
{int m[Max][Max];Matrix() {}friend Matrix operator*(Matrix &m1,Matrix &m2){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++){temp.m[i][j]=0;for(k=0;k<Max;k++)temp.m[i][j]+=(m1.m[i][k]*m2.m[k][j])%INF;temp.m[i][j]%=INF;}return temp;}friend Matrix quickpow(Matrix &M,int n){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++) //单位矩阵if(i==j) temp.m[i][j]=1;else temp.m[i][j]=0;while(n){if(n&1) temp=temp*M;n>>=1;M=M*M;}return temp;}
};
int main()
{int t;sca(t);while(t--){int i,n,k,j=9,sum=0;scanf("%d%d",&n,&k);Matrix res;mem(res.m,0);for(i=0;i<n;i++)for(j=0;j<n;j++)sca(res.m[i][j]);res=quickpow(res,k);for(i=0;i<n;i++)sum=(sum+res.m[i][i])%INF;pri(sum);}return 0;
}

HDU 2604

分析;

解法一:同L=2时的状态递推出后面的状态:

其4个状态,分别是:fm,ff,mm,mf。

fm只可以到mm(因为fmf不符和要求了)

ff只可以到fm(同理)

mm可以到mm,mf

mf可以到fm,ff

所以构造的矩阵是

        fm   ff   mm  mf

fm     0     0    1      0

ff       1     0    0      0

mm   0    0     1      1

mf     1    1     0      0


解法二:同L=0到L=5值递推出来:

1 根据题目的意思,我们可以求出F[0] = 0 , F[1] = 2 , F[2] = 4 , F[3] = 6 , F[4] = 9 , F[5] = 15

2 那么根据上面前5项我们可以求出n >= 5的时候 F[n] = F[n-1]+F[n-3]+F[n-4]

    那么我们就可以构造出矩阵

    | 1 0 1 1 |     | F[n-1] |    | F[n] |

    | 1 0 0 0 |  *  | F[n-2] | = | F[n-1] |

    | 0 1 0 0 |     | F[n-3] |    | F[n-2] |

    | 0 0 1 0 |     | F[n-4] |    | F[n-3] |

设上面构造矩阵为a,则为a^(l-4)*f[4]=f[l-4].

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 10000005
#define Max 4
//#define INF 9973
#define eps 1e-7
using namespace std;
typedef long long ll;
int INF;
struct Matrix //快速幂模板
{int m[Max][Max];Matrix() {}friend Matrix operator*(Matrix &m1,Matrix &m2){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++){temp.m[i][j]=0;for(k=0;k<Max;k++)temp.m[i][j]+=(m1.m[i][k]*m2.m[k][j])%INF;temp.m[i][j]%=INF;}return temp;}friend Matrix quickpow(Matrix &M,int n){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++) //单位矩阵if(i==j) temp.m[i][j]=1;else temp.m[i][j]=0;while(n){if(n&1) temp=temp*M;n>>=1;M=M*M;}return temp;}
};
int main()
{int i,j,k,n;int a[6]={0,2,4,6,9,15},b[5]={9,6,4,2};while(~scanf("%d%d",&k,&n)){if(k<5) {pri(a[k]%n);continue;}Matrix res;mem(res.m,0);int sum=0;INF=n;res.m[0][0]=res.m[0][3]=res.m[0][2]=1;res.m[1][0]=res.m[2][1]=res.m[3][2]=1;res=quickpow(res,k-4);for(i=0;i<Max;i++)sum=(sum+res.m[0][i]*b[i])%INF; //乘以前一个1到4的矩阵pri(sum);}return 0;
}


HDU 2256

这题确实不是自己能会的题了,而且是看了别人的解题报告看了好久才明天啥意思……唉……数学退化太快了……

分析网址:http://blog.csdn.net/chenguolinblog/article/details/10212567

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <list>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define PI acos(-1.0)
#define mem(a,b) memset(a,b,sizeof(a))
#define sca(a) scanf("%d",&a)
#define pri(a) printf("%d\n",a)
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define MM 10000005
#define Max 2
#define INF 1024
#define eps 1e-7
using namespace std;
typedef long long ll;
//int INF;
struct Matrix //快速幂模板
{int m[Max][Max];Matrix() {}friend Matrix operator*(Matrix &m1,Matrix &m2){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++){temp.m[i][j]=0;for(k=0;k<Max;k++)temp.m[i][j]+=(m1.m[i][k]*m2.m[k][j])%INF;temp.m[i][j]%=INF;}return temp;}friend Matrix quickpow(Matrix &M,int n){int i,j,k;Matrix temp;for(i=0;i<Max;i++)for(j=0;j<Max;j++) //单位矩阵if(i==j) temp.m[i][j]=1;else temp.m[i][j]=0;while(n){if(n&1) temp=temp*M;n>>=1;M=M*M;}return temp;}
};
int main()
{int t,n,sum;sca(t);while(t--){sca(n);if(n==1) {pri(9);continue;}Matrix res;mem(res.m,0);res.m[0][0]=5,res.m[0][1]=12;res.m[1][0]=2,res.m[1][1]=5;res=quickpow(res,n-1);sum=(res.m[0][0]*5+res.m[0][1]*2)%INF;sum=(2*sum-1)%INF;pri(sum);}return 0;
}



这篇关于HDU 1757,1575,2604,2256 矩阵快速幂总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1043659

相关文章

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

c++日志库log4cplus快速入门小结

《c++日志库log4cplus快速入门小结》文章浏览阅读1.1w次,点赞9次,收藏44次。本文介绍Log4cplus,一种适用于C++的线程安全日志记录API,提供灵活的日志管理和配置控制。文章涵盖... 目录简介日志等级配置文件使用关于初始化使用示例总结参考资料简介log4j 用于Java,log4c