https://www.hackerrank.com/contests/w27/challenges/hackonacci-matrix-rotations

一开始是没想到观察题的。只想到直接矩阵快速幂。

但是超时了,因为我的矩阵快速幂是应对稀疏矩阵的,

http://www.cnblogs.com/liuweimingcprogram/p/5942591.html

因为当时做这题的时候,以前的矩阵快速幂模板超时,所以就换了个,但是这题用稀疏矩阵的模板会超时,所以就把两个模板都收录算了。但是时间是1.58s,现在是pertest。所以后面的可能会超时,然而这题应该直接观察,其实也不算观察,算数学吧。鸽笼原理

前3项固定,最多1/2 * 1/2 * 1/2 项后,就会和前3项重复。

然后算一算,就发现了重复了。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
int n;
const int maxn = + ;
char str[maxn][maxn];
int ans[];
int f[] = {, , , , , , , };
void init() {
for (int i = ; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
if (i == && j == ) continue;
LL val = (1LL * i * j) * (1LL * i * j);
val %= ;
if (val == ) val = ;
if (f[val] == ) {
str[i][j] = 'Y';
} else str[i][j] = 'X';
}
// cout << endl;
}
for (int i = ; i <= n; ++i) {
for (int j = ; j <= i - ; ++j) {
str[i][j] = str[j][i];
}
}
// for (int i = 1; i <= n; ++i) {
// for (int j = 1; j <= n; ++j) {
// cout << str[i][j];
// }
// cout << endl;
// }
//
int p1 = n, p2 = ;
for (int i = ; i <= n; ++i) {
p1 = n;
p2 = i;
for (int j = ; j <= n; ++j) {
if (str[i][j] != str[p1--][p2]) {
ans[]++;
}
}
p1 = n - i + ;
p2 = n;
for (int j = ; j <= n; ++j) {
if (str[i][j] != str[p1][p2--]) {
ans[]++;
}
}
p1 = n - i + ;
for (int j = ; j <= n; ++j) {
if (str[i][j] != str[p1][j]) {
ans[]++;
}
}
} }
void work() {
int q;
scanf("%d%d", &n, &q);
init();
while (q--) {
int x;
scanf("%d", &x);
// cin >> x;
x %= ;
x /= ;
// cout << ans[x] << endl;
printf("%d\n", ans[x]);
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
work();
return ;
}

观察,0ms

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <assert.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL; #include <iostream>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <string>
int n;
const int maxn = + ;
char str[maxn][maxn];
struct Matrix {
LL a[][];
int row;
int col;
};
//struct Matrix matrix_mul(struct Matrix a, struct Matrix b, int MOD) {
// struct Matrix c = {0};
// c.row = a.row;
// c.col = b.col;
// for (int i = 1; i <= a.row; ++i) {
// for (int k = 1; k <= a.col; ++k) {
// if (a.a[i][k]) {
// for (int j = 1; j <= b.col; ++j) {
// c.a[i][j] += a.a[i][k] * b.a[k][j];
//// c.a[i][j] = (c.a[i][j] + MOD) % MOD;
// }
// c.a[i][j] %= MOD;
// }
// }
// }
// return c;
//}
struct Matrix matrix_mul (struct Matrix a, struct Matrix b, int MOD) {
struct Matrix c = {}; c.row = a.row;
c.col = b.col;
for (int i = ; i <= a.row; i++) {
for (int j = ; j <= b.col; j++) {
for (int k = ; k <= b.row; k++) {
c.a[i][j] += a.a[i][k] * b.a[k][j];
}
c.a[i][j] = (c.a[i][j] + MOD) % MOD;
}
}
return c;
} struct Matrix quick_matrix_pow(struct Matrix ans, struct Matrix base, LL n, int MOD) {
while (n) {
if (n & ) {
ans = matrix_mul(ans, base, MOD);
}
n >>= ;
base = matrix_mul(base, base, MOD);
}
return ans;
}
int ans[];
void init() {
struct Matrix A;
A.row = ;
A.col = ;
A.a[][] = ;
A.a[][] = ;
A.a[][] = ;
struct Matrix B;
B.col = B.row = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
B.a[][] = ;
str[][] = 'Y';
// cout << "1" << " ";
for (int i = ; i <= n; ++i) {
for (int j = i; j <= n; ++j) {
if (i == && j == ) continue;
LL val = (1LL * i * j) * (1LL * i * j);
// cout << val << " ";
struct Matrix t = quick_matrix_pow(A, B, val - , );
// cout << B.a[2][3] << " ";
if (t.a[][] & ) {
str[i][j] = 'Y';
} else str[i][j] = 'X';
// cout << t.a[1][3] << " ";
}
// cout << endl;
}
for (int i = ; i <= n; ++i) {
for (int j = ; j <= i - ; ++j) {
str[i][j] = str[j][i];
}
}
// for (int i = 1; i <= n; ++i) {
// for (int j = 1; j <= n; ++j) {
// cout << str[i][j];
// }
// cout << endl;
// }
//
int p1 = n, p2 = ;
for (int i = ; i <= n; ++i) {
p1 = n;
p2 = i;
for (int j = ; j <= n; ++j) {
if (str[i][j] != str[p1--][p2]) {
ans[]++;
}
}
p1 = n - i + ;
p2 = n;
for (int j = ; j <= n; ++j) {
if (str[i][j] != str[p1][p2--]) {
ans[]++;
}
}
p1 = n - i + ;
for (int j = ; j <= n; ++j) {
if (str[i][j] != str[p1][j]) {
ans[]++;
}
}
} }
void work() {
int q;
cin >> n >> q;
init();
while (q--) {
int x;
cin >> x;
x %= ;
x /= ;
cout << ans[x] << endl;
}
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
IOS;
work();
return ;
}

直接矩阵快速幂,1580ms

Hackonacci Matrix Rotations 观察题 ,更新了我的模板的更多相关文章

  1. E - Addition and Subtraction Hard AtCoder - 2273 思维观察题

    http://arc066.contest.atcoder.jp/tasks/arc066_c?lang=en 这类题目是我最怕的,没有什么算法,但是却很难想, 这题的题解是这样的,观察到,在+号里面 ...

  2. gym101964G Matrix Queries seerc2018k题 cdq分治

    题目传送门 题目大意: 二维平面上有q次操作,每次操作可以是添加一个点,也可以是添加一个矩形,问每次操作后,有多少  点-矩形  这样的pair,pair的条件是点被矩形覆盖(边缘覆盖也算). 思路: ...

  3. C. Timofey and a tree 观察题 + dfs模拟

    http://codeforces.com/contest/764/problem/C 题意:在n个顶点中随便删除一个,然后分成若干个连通子图,要求这若干个连通子图的颜色都只有一种. 记得边是双向的, ...

  4. gym101964G Matrix Queries seerc2018g题 数学归纳法+线段树(递归)

    题目传送门 题目大意: 给出2^k大小的白色矩形,q次操作,每次将一行或者一列颜色反转,问总体矩阵的价值,矩阵的价值定义是,如果整个矩阵颜色相同,价值为1,否则就把这个矩阵切成四份,价值为四个小矩阵的 ...

  5. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  6. 最短路径Dijkstra算法模板题---洛谷P3371 【模板】单源最短路径(弱化版)

    题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度. 输入格式 第一行 ...

  7. 牛客小白月赛6 F 发电 树状数组单点更新 求区间乘积 模板

    链接:https://www.nowcoder.com/acm/contest/136/F来源:牛客网  HA实验是一个生产.提炼“神力水晶”的秘密军事基地,神力水晶可以让机器的工作效率成倍提升.   ...

  8. POJ 3468 A Simple Problem with Integers (伸展树区间更新求和操作 , 模板)

    伸展数最基本操作的模板,区间求和,区间更新.为了方便理解,特定附上一自己搞的搓图 这是样例中的数据输入后建成的树,其中的1,2是加入的边界顶点,数字代表节点编号,我们如果要对一段区间[l, r]进行操 ...

  9. 【线段树成段更新成段查询模板】【POJ3468】A Simple Problem with Integerst

    题目大意: 2个操作 A.区间a b 增加 c B 查询a b; 注意事项:1.记住要清除标记 2.查询时要下放标记,但没必要向上更新 线段:自带的,不用建模 区间和性质:sum: /* WA 1次 ...

随机推荐

  1. 相机标定(Camera calibration)

    简单介绍 摄像机标定(Camera calibration)简单来说是从世界坐标系换到图像坐标系的过程.也就是求终于的投影矩阵 P 的过程,以下相关的部分主要參考UIUC的计算机视觉的课件(网址Spr ...

  2. 点滴记录——Ubuntu 14.04中Chrome浏览器标题栏出现中文乱码

    今天不知道在系统里装的哪个软件与Chrome浏览器所用的字体向冲突了,导致标题栏显示的中文都变成了乱码,其次收藏栏中的中文也变成了乱码.导致原有的收藏内容都无法辨认了.在网上搜索了一下,也有人遇到了相 ...

  3. 【iOS9系列】-3DTouch开发

    [iOS9系列]-3DTouch开发 第一:简介 3DTouch 是iOS9系统系统下,在iPhone6s(iPhone6s Plus)手机上才能够使用的功能.熟练使用后,发现还是很便捷的. 但是模拟 ...

  4. Eclipse项目遇到问题汇总

    1:gc overhead limit exceeded     原因:这是由于项目中eclipse内存分配不足导致     修改:修改eclipse.ini文件     修改如下:          ...

  5. Chapter1-data access reloaded:Entity Framework(下)

    1.4 Delving deep into object/relational differences 深入挖掘对象关系的不同 理解面向对象和关系世界的不同是重要的,因为他会影响你设计一个对象模型或者 ...

  6. jQuery的小例子

    1.在html中插入子页面 <script type="text/javascript"> $(document).ready(function() { $(" ...

  7. 浏览器同部署了https的服务器交互的过程

    1 浏览器发起https请求 2 https服务器发送自己的公钥给浏览器 3 浏览器用https服务器发送过来的公钥加密一个用于双方通信的的对称密码 4 https服务器用自己的私钥解密,获取对称密码 ...

  8. POJ2533 Longest Ordered Subsequence —— DP 最长上升子序列(LIS)

    题目链接:http://poj.org/problem?id=2533 Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 6 ...

  9. luogu 4720 【模板】扩展卢卡斯

    题目大意: 求$C_n^m \mod p$,p不一定为质数 思路: 首先可以将$p$分解为$p1^{a1}*p2^{a2}*...*pk^{ak}$,对于这些部分可以使用$CRT$合并 对于每个$p_ ...

  10. c#截图工具

    厚积薄发,丰富的公用类库积累,助你高效进行系统开发(6)----全屏截图.图标获取.图片打印.页面预览截屏.图片复杂操作等 俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富 ...