UVA10870递推关系(矩阵乘法)
题意:
给以个递推f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), for n > d.,给你n,d,a1,a2..ad ,f[1],f[2]..f[d],让你求f[n]%m.
思路:
比较基础的矩阵题目,每次都构造一个d*d的矩阵,然后用快速幂求出来它的n-1次幂,然后在求出乘积就行了,简单构造,没有什么坑点。
#include<stdio.h>
#include<string.h>
typedef struct
{
long long Mat[16][16];
}MAT;
long long n ,MOD ,d;
MAT mm(MAT a ,MAT b)
{
MAT c;
memset(c.Mat ,0 ,sizeof(c.Mat));
for(int i = 1 ;i <= d ;i ++)
for(int j = 1 ;j <= d ;j ++)
for(int k = 1 ;k <= d ;k ++)
c.Mat[i][j] = (c.Mat[i][j] + a.Mat[i][k] * b.Mat[k][j])%MOD;
return c;
}
MAT Quick(MAT a ,long long b)
{
MAT c;
memset(c.Mat ,0 ,sizeof(c.Mat));
for(int i = 1 ;i <= d ;i ++)
c.Mat[i][i] = 1;
while(b)
{
if(b&1) c = mm(c ,a);
a = mm(a ,a);
b>>=1;
}
return c;
}
int main ()
{
long long D[16] ,F[16] ,i;
MAT A;
while(~scanf("%lld %lld %lld" ,&d ,&n ,&MOD) && d + n + MOD)
{
for(i = 1 ;i <= d ;i ++)
{
scanf("%lld" ,&D[i]);
D[i] %= MOD;
}
for(i = 1 ;i <= d ;i ++)
{
scanf("%lld" ,&F[i]);
F[i] %= MOD;
}
if(n <= d)
{
printf("%lld\n" ,F[n]);
continue;
}
memset(A.Mat ,0 ,sizeof(A.Mat));
int x = 2 ,y = 1;
for(i = 2 ;i <= d ;i ++)
{
A.Mat[x][y] = 1;
x ++ ,y ++;
}
for(i = 1 ;i <= d ;i ++)
A.Mat[i][d] = D[d-i+1];
A = Quick(A ,n - 1);
long long Ans = 0;
for(i = 1 ;i <= d ;i ++)
{
Ans += F[i] * A.Mat[i][1];
Ans %= MOD;
}
printf("%lld\n" ,Ans);
}
return 0;
}
最新文章
- Tomcat中的Session小结
- C++:通过gethostbyname函数,根据服务器的域名,获取服务器IP
- URL 路径长度限制(错误:指定的文件或文件夹名称太长)
- MySQL 数据库双向镜像、循环镜像(复制)
- Linux收集
- Python基础、collections补充
- [LeetCode] Simplify Path(可以不用看)
- Redbean:入门(四) - 反射机制 以及 事务
- Amazon 开始接受 Windows 礼品卡预订
- 【转】PF_NETLINK应用实例NETLINK_KOBJECT_UEVENT具体实现--udev实现原理
- caffe源码学习之Proto数据格式【1】
- 06-Python入门学习-元组、字典、集合类型
- 两个对象的 hashCode()或equals相同,equals或hashCode不一定相同--《案例演示》
- input 标签,不可更改
- [MicroPython]TurnipBit开发板旋转按钮控制直流电机转速
- 2018牛客暑期ACM多校训练营第二场(有坑未填)
- JavaScript基础笔记(九)事件
- 以太坊钱包开发系列2 - 账号Keystore文件导入导出
- MongoDB索引管理-索引的创建、查看、删除
- SoapUI Pro Project Solution Collection-access the soapui object