HDU 5015 233 Matrix(网络赛1009)

本文介绍了一种利用矩阵快速幂解决数列递推问题的方法,通过构造特定的递推矩阵,并采用快速幂算法高效求解数列的第n项。

把第一行的233数列全部左移一位就可以推出一个递推矩阵来

比如输入的是

3 7

23 47 16


可以构造成

B[0][0]=233

B[1][0]=23

B[2][0]=47

B[3][0]=16

B[4][0]=3


递推矩阵A:

10 0 0 0 1

1 1 0 0 0

1 1 1 0 0

1 1 1 1 0

0 0 0 0 1

然后就是矩阵(A^m)*B第n项就是答案


我的代码

#include<iostream>
#include<sstream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<time.h>
#include<set>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
#define inf 0x7fffffff
#define lc l,m,index<<1
#define rc m+1,r,index<<1|1
#define max_n 100005
#define mod 10000007
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define LL __int64
LL n,m;
typedef vector<LL>vec;
typedef vector<vec> mat;
mat A(15,vec(15)),B(15,vec(15)),C(15,vec(15));
void init()
{
	A[0][0]=10;
	for(int i=1;i<=n;i++)
		A[0][i]=0;
	A[0][n+1]=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<=n+1;j++)
		{
			if(j<=i)
				A[i][j]=1;
			else
				A[i][j]=0;
		}
	}
	for(int i=0;i<=n;i++)
		A[n+1][i]=0;
	A[n+1][n+1]=1;
}
mat mul(mat &a,mat &b)
{
    mat c(a.size(),vec(a.size()));

    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=n+1;j++)
        {
           // printf("af\n");
            for(int k=0;k<a[0].size();k++)
            c[i][k]=(c[i][k]+a[i][j]*b[j][k])%mod;
        }
    }
    return c;
}
mat pow(mat a,LL K)
{
    mat b(a.size(),vec(a.size()));
    for(int i=0;i<=n+1;i++)
    b[i][i]=1;
    while(K)
    {
        if(K&1) b=mul(b,a);
        a=mul(a,a);
        K>>=1;
       //printf("asfsa\n");
    }
    return b;
}
int main()
{
	while(~scanf("%I64d%I64d",&n,&m))
	{
		B[0][0]=233;
		for(int i=1;i<=n;i++)
			scanf("%I64d",&B[i][0]);
		B[n+1][0]=3;
		init();
	/*	for(int i=0;i<=n+1;i++)
		{
			for(int j=0;j<=n+1;j++)
				printf("%I64d ",A[i][j]);
			printf("\n");
		}*/
		C=pow(A,m);
		LL ans=0;
	/*	for(int i=0;i<=n+1;i++)
		{
			for(int j=0;j<=n+1;j++)
				printf("%I64d ",C[i][j]);
			printf("\n");
		}*/
		for(int i=0;i<=n+1;i++)
			ans=(ans+C[n][i]*B[i][0])%mod;
		printf("%I64d\n",ans);
		
	}
	return 0;
}



打开链接下载源码: https://pan.quark.cn/s/331a85e1b463 在数字化时代背景下,软件授权与保护显得极为关键,微狗(MicroDog)作为一款硬件加密狗,其主要功能是保障软件的合法使用,避免盗版和未经授权的访问。为了达成这一目的,微狗驱动发挥着不可或缺的作用。驱动程序充当硬件与操作系统之间的沟通纽带,确保两者能够和谐协作。现阶段,64位微狗驱动(UMI64位)已经兼容Windows 11、Windows 10以及Windows 7操作系统,为不同的系统环境提供坚实可靠的支持。 随着Windows操作系统的持续升级,对驱动程序的兼容性需求也在逐步提高。微狗驱动UMI64位版本正是为了应对兼容性问题而研发的。它不仅适配最新版的Windows 11,同时也与过去几年中普遍应用的Windows 10和Windows 7保持兼容。如此全面的系统支持,使得微狗加密狗能够在多种环境中稳定运作,确保软件授权管理不受操作系统版本的限制。 在这个驱动中,特别强调了支持UMI V4.1版本。UMI可能代表Unique Machine Identifier,即用于标识特定硬件设备的唯一序列号。提及UMI V4.1表明该驱动能够精准识别并支援微狗加密狗的此特定型号。同时,这也暗示驱动可能与其他版本的微狗硬件兼容,这意味着用户可以在不同版本的微狗加密狗之间切换而不必频繁更换驱动程序。 UMI64位标签凸显了驱动程序的核心特征,即它专为64位系统进行优化。相较于32位系统,64位系统在处理海量数据、运行大型应用时展现出显著优势,例如能够支持更大的内存地址空间。随着软件复杂性的提升,对硬件资源的需求持续增长,因此64位系统能够提供更优越的性能和稳定性。UMI系列硬件与...
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 ### Xilinx Vivado硬件诊断:ILA与VIO的应用指南 #### 一、背景信息 在FPGA的设计阶段,硬件诊断和验证工作占据着至关重要的地位。根据相关数据统计,在一个典型的FPGA开发流程中,硬件诊断和验证所占用的开发周期比例通常在30%到40%之间。因此,精通FPGA设计工具的调试功能对于提升开发效率具有显著作用。 #### 二、ILA与VIO的功能说明 ##### 1. ILA (Integrated Logic Analyzer) ILA是Xilinx公司提供的一种用于监测FPGA内部信号的逻辑分析仪工具。该工具能够捕获并保存FPGA内部信号波形,从而为开发者提供调试支持。ILA的核心结构如图1所示: **图1 ILA Core** ILA的主要构成部分包括时钟输入端、探针输入端口以及用于存储采样数据的BRAM(Block RAM)。设计人员可以通过配置ILA核来指定探针的总数、采样深度以及每个探针的位宽。此外,ILA还支持通过JTAG接口与外部调试设备进行通信。 - **探针输入端口**:用于连接FPGA内部信号线路。 - **采样深度**:决定了能够存储的样本数量。 - **探针位宽**:指定了每个探针可以监控的信号位数。 - **通信机制**:通过JTAG接口与调试核心集线器实现交互。 ##### 2. VIO (Virtual Input/Output core) VIO是一种能够实时监控和驱动FPGA内部信号的内核。与ILA的不同之处在于,VIO无需额外的片上或片外存储器来保存数据。 - **信号类型**: - **Input Probes**:...
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值