FZU_1692

首先感觉输入数据里面的L和R应该反过来读取即先读入R再读入L,要不然样例算不出来,不知道是不是我理解错题意了。

矩阵不难构造,但这个题让进一步注意到了矩阵运算中的常熟优化:

①由于递推关系的矩阵各行是循环同构的,而两个这样的循环同构的矩阵的乘积依然是循环同构的,所以在用二分矩阵的方法计算的时候,可以先用O(N^2)的时间计算出第一行,再用O(N^2)的时间平移出下面各行的结果,这样每次做乘法的复杂度就由O(N^3)减少到了O(N^2)。

②矩阵乘法的multiply的函数最好使用引用传递传参,如果直接传参的话每次相当于把矩阵复制一遍,这样效率就比较低了。

#include<stdio.h>
#include<string.h>
#define MAXD 110
int N, M, L, R, D, a[MAXD];
struct Matrix
{int a[MAXD][MAXD];Matrix(){memset(a, 0, sizeof(a));}void init(){int i, j;for(i = 0; i < N; i ++)a[i][(i + N - 1) % N] = L, a[i][i] = 1, a[i][(i + 1) % N] = R;}
};
Matrix multiply(Matrix &x, Matrix &y)
{int i, j, k;Matrix z;for(k = 0; k < N; k ++)if(x.a[0][k]){for(j = 0; j < N; j ++)if(y.a[k][j])z.a[0][j] = (z.a[0][j] + (long long)x.a[0][k] * y.a[k][j]) % D;}for(i = 1; i < N; i ++){z.a[i][0] = z.a[i - 1][N - 1];for(j = 1; j < N; j ++)z.a[i][j] = z.a[i - 1][j - 1];}return z;
}
Matrix powmod(Matrix unit, Matrix mat, int n)
{while(n){if(n & 1)unit = multiply(mat, unit);n >>= 1;mat = multiply(mat, mat);}return unit;
}
void solve()
{int i, j, ans;Matrix unit, mat;scanf("%d%d%d%d%d", &N, &M, &R, &L, &D);for(i = 0; i < N; i ++){scanf("%d", &a[i]);unit.a[i][i] = 1;}mat.init();unit = powmod(unit, mat, M);for(i = 0; i < N; i ++){ans = 0;for(j = 0; j < N; j ++)if(unit.a[i][j] && a[j])ans = (ans + (long long)unit.a[i][j] * a[j]) % D;if(i)printf(" ");printf("%d", ans);}printf("\n");
}
int main()
{int t;scanf("%d", &t);while(t --){solve();}return 0;
}

FZU 1692 Key problem相关推荐

  1. FZU 2214 Knapsack problem

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2214 题        意:给你一个背包,让你往里面尽量加价值总和多的物品. 思        路:是个01背 ...

  2. FZU 2214 Knapsack problem(背包问题)

    Description 题目描述 Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

  3. FZU 2108 Mod problem

    参考这里:http://blog.csdn.net/q775968375/article/details/8828952 大神说的没错,这跟建树没有半毛线的关系,就是一DFS... 1 #includ ...

  4. 【计算几何】FZU Problem 2270 Two Triangles

    http://acm.fzu.edu.cn/problem.php?pid=2270 [题意] 给定6到10个点,从中选出6个不同的点组成两个三角形,使其中一个三角形可以通过另一个三角形平移和旋转得到 ...

  5. FZU Problem 2168 防守阵地 I

    http://acm.fzu.edu.cn/problem.php?pid=2168 题目大意: 给定n个数和m,要求从n个数中选择连续的m个,使得a[i]*1+a[i+1]*2+--a[i+m]*m ...

  6. FZU 1649 Prime number or not (Miller-Rabin素数测试)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1649 题目大意:很直接,判断一个数n(2<=n<=10^18)是不是素数.   当n达到long ...

  7. Problem 2238 Daxia Wzc's problem 1627 瞬间移动

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1627 http://acm.fzu.edu.cn/problem.php ...

  8. FZU 2082 过路费

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 题意: 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每 ...

  9. fzu 1894 单调队列

    http://acm.fzu.edu.cn/problem.php?pid=1894  Problem 1894 志愿者选拔 Accept: 1328    Submit: 4200 Time Lim ...

最新文章

  1. CISCO 路由器(2)
  2. spark mongo java_java及spark2.X连接mongodb3.X单机或集群的方法(带认证及不带认证)...
  3. Matlab之logspace
  4. 漫画:什么是HashMap
  5. Detected call of `lr_scheduler.step()` before `optimizer.step()`.
  6. 批量文件替换_让你效率翻倍的15个Word批量操作小技巧
  7. Libhybris之Glibc和Bionic共存时的TLS问题(四)
  8. Spark分布式安装
  9. 巴西矿坝决堤事故已致58人死亡 多达300人失踪
  10. 阿里云云计算 14 使用阿里云中的OSS
  11. 项目开发 —— 一页纸项目管理(OPPM)
  12. Python开源人脸识别库,识别率达99.38%!内附教程+源码分享
  13. Protel DXP2004 中文版 下载及安装
  14. 初学者入门——NOI题库1.2
  15. 第七章 DirectX 数学向量,碰撞检测和粒子系统(上)
  16. 显著性水平 置信度 置信区间 实例讲解
  17. 拥抱趋势,蓄能跃迁——2018慧点科技企业协同及治理创新论坛圆满举行
  18. “衣衫合身定制”获数百万元天使轮投资,在线定制男性专属衬衫
  19. python 实现usn读取记录
  20. Android 获取最近几天的日历日程

热门文章

  1. charCode与keyCode的区别
  2. UIWindow的rootViewController的问题
  3. 接口测试(二)--APP抓包
  4. 配置lvs nat模式下real server服务器端lvsrs脚本
  5. 《深入理解Spark:核心思想与源码分析》——1.3节阅读环境准备
  6. Firefly是什么?有什么特点?
  7. EIGRP分解试验部分-LAB1:EIGRP基本试验
  8. 【算法基础】动态规划的理解
  9. 总结几个等价无穷小相关的关系运算
  10. .bat以管理员身份运行