FZU 1692 Key problem
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相关推荐
- FZU 2214 Knapsack problem
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2214 题 意:给你一个背包,让你往里面尽量加价值总和多的物品. 思 路:是个01背 ...
- 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 ...
- FZU 2108 Mod problem
参考这里:http://blog.csdn.net/q775968375/article/details/8828952 大神说的没错,这跟建树没有半毛线的关系,就是一DFS... 1 #includ ...
- 【计算几何】FZU Problem 2270 Two Triangles
http://acm.fzu.edu.cn/problem.php?pid=2270 [题意] 给定6到10个点,从中选出6个不同的点组成两个三角形,使其中一个三角形可以通过另一个三角形平移和旋转得到 ...
- 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 ...
- FZU 1649 Prime number or not (Miller-Rabin素数测试)
题目链接:http://acm.fzu.edu.cn/problem.php?pid=1649 题目大意:很直接,判断一个数n(2<=n<=10^18)是不是素数. 当n达到long ...
- Problem 2238 Daxia Wzc's problem 1627 瞬间移动
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1627 http://acm.fzu.edu.cn/problem.php ...
- FZU 2082 过路费
题目链接:http://acm.fzu.edu.cn/problem.php?pid=2082 题意: 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每 ...
- fzu 1894 单调队列
http://acm.fzu.edu.cn/problem.php?pid=1894 Problem 1894 志愿者选拔 Accept: 1328 Submit: 4200 Time Lim ...
最新文章
- CISCO 路由器(2)
- spark mongo java_java及spark2.X连接mongodb3.X单机或集群的方法(带认证及不带认证)...
- Matlab之logspace
- 漫画:什么是HashMap
- Detected call of `lr_scheduler.step()` before `optimizer.step()`.
- 批量文件替换_让你效率翻倍的15个Word批量操作小技巧
- Libhybris之Glibc和Bionic共存时的TLS问题(四)
- Spark分布式安装
- 巴西矿坝决堤事故已致58人死亡 多达300人失踪
- 阿里云云计算 14 使用阿里云中的OSS
- 项目开发 —— 一页纸项目管理(OPPM)
- Python开源人脸识别库,识别率达99.38%!内附教程+源码分享
- Protel DXP2004 中文版 下载及安装
- 初学者入门——NOI题库1.2
- 第七章 DirectX 数学向量,碰撞检测和粒子系统(上)
- 显著性水平 置信度 置信区间 实例讲解
- 拥抱趋势,蓄能跃迁——2018慧点科技企业协同及治理创新论坛圆满举行
- “衣衫合身定制”获数百万元天使轮投资,在线定制男性专属衬衫
- python 实现usn读取记录
- Android 获取最近几天的日历日程