uva 10870
https://vjudge.net/problem/UVA-10870
题意:
f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + adf(n − d), for n > d
给出f(1),f(2) ... f(d) 以及a1,a2...ad,然后给出一个n和m的值,计算f(n) % m的值
思路:
矩阵快速幂模板题,只是构建矩阵比较困难,其实这题的构建矩阵是比较简单的,这题的模型也是一个相当广泛的模型。
|a1 a2 a3 a4 a5| | f[n] | | f[n+1] |
|1 | | f[n-1] | | f[n] |
| 1 | * | f[n-2] | = | f[n-1] | (空白处为0)
| 1 | | f[n-3] | | f[n-2] |
| 1 | | f[n-4] | | f[n-3] |
就是这样一个关系,可以用手推一下。
f(n) = A^(n-d) * f(d);
之后就直接套模板啦。
最后的f(n)其实是通过得到的结果矩阵的第一行乘以f(d)这个矩阵得到的,只不过乘的时候要关注原矩阵的顺序,别乘反了。
注意在n <= d的时候是直接取余输出的。(矩阵乘法的时候也要一边乘,一边取余)。
代码:
#include <stdio.h>
#include <string.h> long long d,n,m; long long f[]; struct matrix
{
long long a[][];
}; matrix mul(matrix x,matrix y)
{
matrix c; for (int i = ;i < d;i++)
for (int j = ;j < d;j++)
{
c.a[i][j] = ; for (int k = ;k < d;k++)
{
c.a[i][j] = (c.a[i][j] + x.a[i][k] * y.a[k][j] % m) % m;
}
} return c;
} void solve(matrix t,long long o)
{
matrix e; memset(e.a,,sizeof(e.a)); for (int i = ;i < d;i++)
e.a[i][i] = ; while (o)
{
if (o & )
{
e = mul(e,t);
} o >>= ; t = mul(t,t);
} long long res = ; for (int i = ;i < d;i++)
res = (res + e.a[][i] * f[d-i-]) % m; printf("%lld\n",res);
} int main()
{ while (scanf("%lld%lld%lld",&d,&n,&m) != EOF)
{
if (d == && n == && m == ) break; matrix p; memset(p.a,,sizeof(p.a)); for (int i = ;i < d;i++)
scanf("%lld",&p.a[][i]); for (int i = ;i < d;i++)
p.a[i][i-] = ; for (int i = ;i < d;i++)
scanf("%lld",&f[i]); if (n <= d)
{
printf("%lld\n",f[n-] % m); continue;
} solve(p,n-d);
} return ;
}
uva 10870的更多相关文章
- UVA 10870 - Recurrences(矩阵高速功率)
UVA 10870 - Recurrences 题目链接 题意:f(n) = a1 f(n - 1) + a2 f(n - 2) + a3 f(n - 3) + ... + ad f(n - d), ...
- UVa 10870 - Recurrences
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- 矩阵快速幂 UVA 10870 Recurrences
题目传送门 题意:f(n) = a1f(n − 1) + a2f(n − 2) + a3f(n − 3) + . . . + adf(n − d), for n > d,求f (n) % m.训 ...
- UVa 10870 & 矩阵快速幂
题意: 求一个递推式(不好怎么概括..)的函数的值. 即 f(n)=a1f(n-1)+a2f(n-2)+...+adf(n-d); SOL: 根据矩阵乘法的定义我们可以很容易地构造出矩阵,每次乘法即可 ...
- UVa 10870 (矩阵快速幂) Recurrences
给出一个d阶线性递推关系,求f(n) mod m的值. , 求出An-dv0,该向量的最后一个元素就是所求. #include <iostream> #include <cstdio ...
- Recurrences UVA - 10870 (斐波拉契的一般形式推广)
题意:f(n) = a1f(n−1) + a2f(n−2) + a3f(n−3) + ... + adf(n−d), 计算这个f(n) 最重要的是推出矩阵. #include<cstdio> ...
- UVA 10870 Recurrences(矩阵乘法)
题意 求解递推式 \(f(n)=a_1*f(n-1)+a_2*f(n-2)+....+a_d*f(n-d)\) 的第 \(n\) 项模以 \(m\). \(1 \leq n \leq 2^{31}-1 ...
- UVa 10870 Recurrences (矩阵快速幂)
题意:给定 d , n , m (1<=d<=15,1<=n<=2^31-1,1<=m<=46340).a1 , a2 ..... ad.f(1), f(2) .. ...
- UVA - 10870 Recurrences 【矩阵快速幂】
题目链接 https://odzkskevi.qnssl.com/d474b5dd1cebae1d617e6c48f5aca598?v=1524578553 题意 给出一个表达式 算法 f(n) 思路 ...
随机推荐
- 【node】安装和配置node项目文件
需要把 views文件中的子文件全部改为以 .ejs的后缀 1·npm install express -g (全局安装) 2·npm install -g express-generator (安装 ...
- 用disabled属性修饰a标签,a标签仍然能点击
1.不知道各位同学有没有遇到跟我相同的问题,就是用jQuery操作a标签disabled的,来控制重复提交表单 做过开发的都知道,表单验证重复提交,包含前端和后端,两方面的控制.前端控制使我们常用的手 ...
- 集合详解(python)
集合概念 集合是一个数学概念:由一个或多个确定的元素所构成的整体叫做集合. 集合中的元素三个特征: 确定性(元素必须可hash) 互异性(去重)--将一个列表变为集合,就自动去重了 无序性(集合中的元 ...
- 笔记:Eclipse 安装 Hibernate Tools
在线安装,要求 Eclipse Neon 4.6 版本和Java 8,在 Help > Install New Software,在打开的窗体中的 Work with 中输入URL地址" ...
- JDK1.8源码(四)——java.util.Arrays 类
java.util.Arrays 类是 JDK 提供的一个工具类,用来处理数组的各种方法,而且每个方法基本上都是静态方法,能直接通过类名Arrays调用. 1.asList public static ...
- Nginx正向代理与反向代理
1.正向代理: 正向代理类似一个跳板机,代理访问外部资源. 典型应用:为在防火墙内的局域网客户端提供访问Internet的途径 如:IE例外设置代理服务器 正向代理配置实例:为不影响默认配置:添 ...
- Java多线程:乐观锁、悲观锁、自旋锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据 ...
- c#多线程,进度条,实时给前台发送数据
///做了一个wpf多线程,在实际场景中利用多线程保证程序不会卡死,性能上有所提高 //启动线程处理 Thread thread1 = new Thread(Update ...
- python开发装饰器的应用
python全栈开发-Day10 装饰器(闭合函数的应用场) 一. 装饰器 装饰器就是闭包函数的一种应用场景 什么是闭包函数?我们再来回忆一下: 闭包函数: 定义在函数内部的函数,并且该函数包含对 ...
- 强烈推荐!!!Fiddler抓取https设置详解(图文)
很多实用fiddler抓包,对于http来说不需太多纠结,随便设置下就能用,但是抓取https就死活抓不了, 诸如以下问题: creation of the root certificate was ...