解题报告:FZU1692 Key problem 循环矩阵快速幂
来源:互联网 发布:淘宝白色连衣裙 编辑:程序博客网 时间:2024/05/21 17:17
Problem 1692 Key problem
Accept: 196 Submit: 862
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Input
Output
Each case separated by a space. See sample.
Sample Input
1 3 2 3 4 10000 1 2 3
Sample Output
120 133 131
Source
FOJ月赛-2009年3月--- CoralSubmit Back Status Discuss
题意:
给定一个序列,问t次操作后的序列
每次操作:
A[n] = L * A[n-1] + R * A[n+1] + A[n]
也就是序列中的前一个数乘以L 加上序列中的后一个数乘以R + 它本身,注意,第一个数的前一个数为最后一个数,最后一个数的后一个数为第一个数。
思路:
很容易写出矩阵,然后发现这是一个循环矩阵(详见 check )那么利用循环矩阵的可积性(循环矩阵乘以循环矩阵得到的新矩阵也是循环矩阵),我们只用正常计算第一行的新矩阵数值,使得加速幂可以由n^3log(t)降到n^2log(t)刚好能满足题目的时间要求。
代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int n,L,R,mod,t;int A[105];int ans[105];void debug(int a[105][105]){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ printf("%d%c",a[i][j],j==n-1?'\n':' '); } }printf("\n");}void fast_mat(){ int mat[105][105]={0}; int tmp[105]={0}; int res[105][105]={0}; for(int i=0;i<n;i++){ int a = i?i-1:n-1; int b = i==n-1?0:i+1; mat[i][i] = res[i][i] = 1; mat[i][a] = L; mat[i][b] = R; } //debug(mat); while(t){ if(t&1){ for(int i=0;i<n;i++){tmp[i] = 0; for(int j=0;j<n;j++){ tmp[i] = (tmp[i] + res[0][j] * mat[i][j]%mod)%mod; } }for(int i=0;i<n;i++){ res[0][i] = tmp[i]; } for(int i=1;i<n;i++){ for(int j=0;j<n;j++){ int k = j?j-1:n-1; res[i][j] = res[i-1][k]; } } } for(int i=0;i<n;i++){tmp[i] = 0; for(int j=0;j<n;j++){ tmp[i] = (tmp[i] + mat[0][j] * mat[j][i]%mod)%mod; } }for(int i=0;i<n;i++){ mat[0][i] = tmp[i]; } for(int i=1;i<n;i++){ for(int j=0;j<n;j++){ int k = j?j-1:n-1; mat[i][j] = mat[i-1][k]; } } t >>= 1; //debug(mat); }//debug(res); for(int i=0;i<n;i++){ans[i]=0; for(int j=0;j<n;j++){ ans[i] = (ans[i] + A[j]*res[i][j]%mod)%mod; } }}int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d%d%d%d%d",&n,&t,&L,&R,&mod); for(int i=0;i<n;i++){ scanf("%d",&A[i]); }fast_mat(); for(int i=0;i<n;i++){ printf("%d%c",ans[i],i!=n-1?' ':'\n'); } }return 0;}
0 0
- 解题报告:FZU1692 Key problem 循环矩阵快速幂
- FZU - 1692 Key problem 矩阵快速幂
- HDU 2256 Problem of Precision 解题报告(矩阵快速幂 + 构造)
- FZU 1692 Key problem(构造矩阵+矩阵快速幂)
- FZU Problem 1692 Key problem(循环矩阵)
- fzu 1692 Key problem 循环矩阵
- FZU 1692 Key problem(循环矩阵)
- Uva 10870 Recurrences 解题报告(矩阵快速幂)
- 解题报告:HDU5015 233 Matrix 矩阵快速幂
- 解题报告: 快速幂
- HDU 4291 A Short problem(矩阵快速幂+循环节)
- HDU 4291 A Short problem // 矩阵快速幂, 循环节
- HDU 4291-A Short problem-循环节+矩阵快速幂
- POJ 3233 Matrix Power Series 解题报告(子矩阵构造+矩阵快速幂)
- HDU 4576 Robot 解题报告(循环矩阵)
- POJ 3735 Training little cats 解题报告(矩阵构造+快速幂优化)
- 解题报告:HDU_6185 Covering (轮廓线DP+高斯消元+矩阵快速幂)
- 解题报告:HDU_6176 Function Counting (离散化DP+矩阵快速幂)
- java 播放音乐
- 面向对象_一个标准学生类的代码及测试
- POJ 2299 Ultra-QuickSort【树状数组求逆序】
- java 中的”static”关键字
- C#基础知识(十一)——泛型集合、文件管理、多态、接口
- 解题报告:FZU1692 Key problem 循环矩阵快速幂
- poj 2187 Beauty Contest
- [Leetcode]94. Binary Tree Inorder Traversal
- HTML canvas一些你可能忽视的自带属性
- 一周乱弹(1,摸态框增加纵向滚动条2,jQuery 鼠标点击事件3,通过ajax实现批量导出。4,windows查询占用某个端口号程序并杀死其进程)
- Java异常(一) Java异常简介及其架构
- EZ的间谍网络
- CodeForces-707A. Brain's Photos
- Listener