UVA - 10870 Recurrences 矩阵快速幂
2015-06-01 22:50
302 查看
题目大意:有一个规则
f(n) = a1 *f(n - 1) + a2 *f(n - 2) + a3 *f(n - 3) + … + ad* f(n - d), for n > d.求f(n)
解题思路:矩阵快速幂水题,类似fibonacci
f(n) = a1 *f(n - 1) + a2 *f(n - 2) + a3 *f(n - 3) + … + ad* f(n - d), for n > d.求f(n)
解题思路:矩阵快速幂水题,类似fibonacci
[code]#include<cstdio> typedef long long ll; const int N = 20; struct Matrix{ ll mat ; }A, B, tmp; ll n, d, m; ll a , f ; void init() { for(int i = 0; i < d; i++) for(int j = 0; j < d; j++) { A.mat[i][j] = B.mat[i][j] = 0; if(i == j) B.mat[i][j] = 1; } for(int i = 0; i < d; i++) A.mat[i][0] = a[i]; for(int i = 1; i < d; i++) A.mat[i-1][i] = 1; } Matrix matMul(Matrix x, Matrix y) { for(int i = 0; i < d; i++) for(int j = 0; j < d; j++) { tmp.mat[i][j] = 0; for(int k = 0; k < d; k++) tmp.mat[i][j] = (tmp.mat[i][j] + x.mat[i][k] * y.mat[k][j]) % m; } return tmp; } void solve() { while(n) { if(n & 1) B = matMul(B,A); A = matMul(A,A); n >>= 1; } } int main() { while(scanf("%lld%lld%lld", &d, &n, &m) != EOF) { if(n + m + d == 0) break; for(int i = 0; i < d; i++) scanf("%lld", &a[i]); for(int i = 0; i < d; i++) scanf("%lld", &f[i]); if(n <= d) { printf("%lld\n", f[n - 1] % m); continue; } init(); n -= d; solve(); ll ans = 0; for(int i = 0; i < d; i++) ans = (ans + (B.mat[i][0] * f[d - 1 - i]) % m) % m; printf("%lld\n", ans % m); } return 0; }
相关文章推荐
- [013] 百度地图API之城市POI搜索-获取所有结果(Android)
- [012] 百度地图API之公交换乘方案搜索(Android)
- 又拍云突发故障造成图片无法上传
- cdoj 65 CD Making 水题
- String hash functions
- [011] 百度地图API之POI搜索-发现你身边的兴趣点,如超市、餐厅、ATM...(Android)
- FOJ 1063 三维扫描 // DFS
- max-width与min-width区别
- gtk+学习笔记(五)
- 后续阶段第一天
- (转)FirstResponder 释放问题
- hdu 2159 FATE(二维完全背包)
- python中函数返回值为func 和func() 的区别
- twemproxy
- struts2 jsp表单提交后保留表单中输入框中的值 下拉框select与input
- 一百网页制作之5
- Google Protobuf 使用 Java 版
- Project Euler:Problem 25 1000-digit Fibonacci number
- poj 1703 Find them, Catch them 【带权并查集】
- String对象不可改变的特性