UVa 10870 & 矩阵快速幂
题意:
求一个递推式(不好怎么概括。。)的函数的值。
即 f(n)=a1f(n-1)+a2f(n-2)+...+adf(n-d);
SOL:
根据矩阵乘法的定义我们可以很容易地构造出矩阵,每次乘法即可求出下一位f(n)的值并在距震中保存f(n)-----f(n-d+1)。
像我这种傻逼看错好几次运算法则的人 = =
第一道矩乘对着老人家模板打得几乎一模一样-----只是觉得他的写法比较优雅= =(虽然我感觉那么多memcpy会不会让常数很大。。。)
CODE:
- /*==========================================================================
- # Last modified: 2016-03-03 21:11
- # Filename: uva10870.cpp
- # Description:
- ==========================================================================*/
- #define me AcrossTheSky
- #include <cstdio>
- #include <cmath>
- #include <ctime>
- #include <string>
- #include <cstring>
- #include <cstdlib>
- #include <iostream>
- #include <algorithm>
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <vector>
- #define lowbit(x) (x)&(-x)
- #define FOR(i,a,b) for((i)=(a);(i)<=(b);(i)++)
- #define FORP(i,a,b) for(int i=(a);i<=(b);i++)
- #define FORM(i,a,b) for(int i=(a);i>=(b);i--)
- #define ls(a,b) (((a)+(b)) << 1)
- #define rs(a,b) (((a)+(b)) >> 1)
- #define getlc(a) ch[(a)][0]
- #define getrc(a) ch[(a)][1]
- #define maxn 100
- #define maxm 100000
- #define pi 3.1415926535898
- #define _e 2.718281828459
- #define INF 1070000000
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- template<class T> inline
- void read(T& num) {
- bool start=false,neg=false;
- char c;
- num=0;
- while((c=getchar())!=EOF) {
- if(c=='-') start=neg=true;
- else if(c>='0' && c<='9') {
- start=true;
- num=num*10+c-'0';
- } else if(start) break;
- }
- if(neg) num=-num;
- }
- /*==================split line==================*/
- typedef long long Matrix[maxn][maxn];
- typedef long long Vector[maxn];
- int n,m,d,sz;
- void matrix_mul(Matrix A,Matrix B,Matrix res){
- Matrix C;
- memset(C,0,sizeof(C));
- FORP(i,0,sz-1)
- FORP(j,0,sz-1)
- FORP(k,0,sz-1)C[i][j]=(C[i][j]+A[i][k]*B[k][j])%m;
- memcpy(res,C,sizeof(C));
- }
- void matrix_pow(Matrix A,int n,Matrix res){
- Matrix a,r;
- memcpy(a,A,sizeof(a));
- memset(r,0,sizeof(r));
- FORP(i,0,sz-1) r[i][i]=1;
- while (n){
- if (n&1) matrix_mul(r,a,r);
- n >>= 1;
- matrix_mul(a,a,a);
- }
- memcpy(res,r,sizeof(r));
- }
- void transform(Vector d,Matrix A,Vector res){
- Vector r;
- memset(r,0,sizeof(r));
- FORP(i,0,sz-1)
- FORP(j,0,sz-1) r[j]=(r[j]+d[i]*A[i][j])%m;
- memcpy(res,r,sizeof(r));
- }
- int main(){
- while (scanf("%d%d%d",&d,&n,&m)!=EOF){
- if (d==0 && n==0 && m==0) return 0;
- Matrix A;
- Vector a,f;
- FORP(i,0,d-1) { read(a[i]); a[i]%=m;}
- FORM(i,d-1,0) { read(f[i]); f[i]%=m;}
- memset(A,0,sizeof(A));
- FORP(i,0,d-1) A[i][0]=a[i];
- FORP(i,1,d-1) A[i-1][i]=1;
- sz=d;
- matrix_pow(A,n-d,A);
- transform(f,A,f);
- cout << f[0] << endl;
- }
- }
UVa 10870 & 矩阵快速幂的更多相关文章
- UVa 10870 (矩阵快速幂) Recurrences
给出一个d阶线性递推关系,求f(n) mod m的值. , 求出An-dv0,该向量的最后一个元素就是所求. #include <iostream> #include <cstdio ...
- UVA - 11149 (矩阵快速幂+倍增法)
第一道矩阵快速幂的题:模板题: #include<stack> #include<queue> #include<cmath> #include<cstdio ...
- 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) 思路 ...
- POJ-3070Fibonacci(矩阵快速幂求Fibonacci数列) uva 10689 Yet another Number Sequence【矩阵快速幂】
典型的两道矩阵快速幂求斐波那契数列 POJ 那是 默认a=0,b=1 UVA 一般情况是 斐波那契f(n)=(n-1)次幂情况下的(ans.m[0][0] * b + ans.m[0][1] * a) ...
- uva 10518 - How Many Calls?(矩阵快速幂)
题目链接:uva 10518 - How Many Calls? 公式f(n) = 2 * F(n) - 1, F(n)用矩阵快速幂求. #include <stdio.h> #inclu ...
- Tribonacci UVA - 12470 (简单的斐波拉契数列)(矩阵快速幂)
题意:a1=0;a2=1;a3=2; a(n)=a(n-1)+a(n-2)+a(n-3); 求a(n) 思路:矩阵快速幂 #include<cstdio> #include<cst ...
- UVA - 10689 Yet another Number Sequence 矩阵快速幂
Yet another Number Sequence Let’s define another number sequence, given by the foll ...
- UVA - 10229 Modular Fibonacci 矩阵快速幂
Modular Fibonacci The Fibonacci numbers (0, 1, 1, 2, 3, 5, 8, 13, 21, 3 ...
随机推荐
- NYOJ题目1051simone牌文本编辑器
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAKFCAIAAABeD4iTAAAgAElEQVR4nO3dO3LjOtOA4X8TzrUQx1
- hdu 4911Inversion
链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 题意:给定一个序列和k,求在k次交换之后序列的逆序数,只能相邻两个数交换且只有左边的数大于右边时才能 ...
- IIS网站发布若干问题
1.Win7 64位 IIS未能加载文件或程序集"System.Data.SQLite"或它的某一个依赖项 未能加载文件或程序集"System.Data.SQLite ...
- Multiple types were found that match the controller named 'Home'. (weird error)
found the error, because I changed the namespace and assembly name, then on the bin folder the old d ...
- [读书笔记] Web 前端开发修炼之道
原创地址:http://www.cnblogs.com/bnbqian/p/3735565.html 转载请注明出处 今天我们要读的书是Web 前端开发修炼之道 第1章 从网站重构说起 1.1 糟糕的 ...
- ThinkPHP中getField( )和field( )
做数据库查询的时候,比较经常用到这两个,总是查手册,记不住,现在把它总结下,希望以后用的时候不查手册了. 不管是用select 查询数据集,还是用find 查询数据,常配合连贯操作where.fiel ...
- HR外包系统 - 工资计算-几种常见账单计算规则
01-正常工资计税 (包括同一月多地计税方式) 02-年终奖计税 (包括可分批发放,但计税总额不变) 按工资 除以月份,看落在那个计税区间,获取税率和扣除数,再用总额*税率-扣除数,要考虑当月工资如 ...
- JFreeChart 使用一 饼图之高级特性
原文链接:http://www.cnblogs.com/jtmjx/archive/2013/04/23/jfreechart_advantage.html 本文主要讲解JFreeChart中饼图的一 ...
- 学习linux内核时常碰到的汇编指令(1)
转载:http://blog.sina.com.cn/s/blog_4be6adec01007xvg.html 80X86 汇编指令符号大全 +.-.*./∶算术运算符. &∶宏处理操作符. ...
- ASP.NET MVC使用过滤器进行权限控制
1.新建MVC项目 2.找到Models文件夹,新建 LoginCheckFilterAttribute 类 public class LoginCheckFilterAttribute : Acti ...