FZU 1911 Construct a Matrix
题目链接:Construct a Matrix
题意:构造一个矩阵,要求矩阵的每行每列的和都不相同。矩阵的边长是前n项斐波那契的和。
思路:由sn = 2*(fn-1)+(fn-2)-1,只要知道第n-1和第n-2项即可,n的范围是10^9,可由矩阵快速幂求出第n项。然后,构造矩阵,上三角为1,下三角全为-1,对角线1和0交替。【真是个天才...!!!】矩阵快速幂求第n项时,构造的矩阵是a[0][0] = f2, a[1][0] = f1, a[0][1] = 1, a[1][1] = 0........【ACMer的脑洞真大...可怕....当然不包括我辣...】
知道思路当然就好实现了。附代码:
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std; struct Mat{
int a[2][2];
void init1() { // 斐波那契初始矩阵
a[0][0] = a[0][1] = a[1][0] = 1;
a[1][1] = 0;
}
void init2() { //单位矩阵
a[0][0] = a[1][1] = 1;
a[0][1] = a[1][0] = 0;
}
}; Mat mul(Mat aa, Mat b, int m) { // 矩阵乘法mod m
Mat ans;
for (int i=0; i<2; ++i) {
for (int j=0; j<2; ++j) {
ans.a[i][j] = 0;
for (int k=0; k<2; ++k) {
ans.a[i][j] += ((aa.a[i][k]%m)*(b.a[k][j]%m))%m;
ans.a[i][j] %= m;
//ans.a[i][j] += aa.a[i][k]*b.a[k][j];
}
//cout << ans.a[i][j] << "....\n";
}
}
return ans;
} Mat mul_mat_quick(Mat a, int n, int m) { // 矩阵快速幂%m
Mat ans;
ans.init2();
while(n) {
if (n%2) ans = mul(ans, a, m);
a = mul(a, a, m);
n /= 2;
}
return ans;
} int num[210][210]; int main() {
int t;
int cas = 0;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m);
Mat a;
a.init1();
Mat ans = mul_mat_quick(a, n-1, m);
int fn1 = ans.a[0][0]; // fn-1
int fn2 = ans.a[1][0]; // fn-2
//cout << fn1 << "++++=" << fn2 << endl;
int sn = (2*fn1 + fn2 - 1)%m; //矩阵边长
// cout << sn << "===\n"; if (sn%2 || sn==0) {
printf("Case %d: No\n", ++cas);
continue;
} printf("Case %d: Yes\n", ++cas);
memset(num, 0, sizeof(num));
for (int i=1; i<=sn; ++i) {
for (int j=1; j<=sn; ++j) {
if (i<j) num[i][j] = 1;
else num[i][j] = -1;
}
}
int pre = 1;
for (int i=1; i<=sn; ++i) {
num[i][i] = (pre^1);
pre ^= 1;
}
for (int i=1; i<=sn; ++i) {
for (int j=1; j<=sn; ++j) {
if (j==1) printf("%d", num[i][j]);
else printf(" %d", num[i][j]);
}
printf("\n");
}
}
return 0;
}
FZU 1911 Construct a Matrix的更多相关文章
- fzu 1911 Construct a Matrix(矩阵快速幂+规律)
题目链接:fzu 1911 Construct a Matrix 题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和.r = s[n] % m.构造一个r * r的矩阵,只 ...
- fzu 1911 C. Construct a Matrix
C. Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...
- Construct a Matrix (矩阵快速幂+构造)
There is a set of matrixes that are constructed subject to the following constraints: 1. The matrix ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
- [kuangbin带你飞]专题1-23题目清单总结
[kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...
- ACM--[kuangbin带你飞]--专题1-23
专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 FliptilePOJ 1426 Find T ...
- <转载> OpenGL Projection Matrix
原文 OpenGL Projection Matrix Related Topics: OpenGL Transformation Overview Perspective Projection Or ...
- Palindromic Matrix
Palindromic Matrix time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Codeforces Round #540 (Div. 3) C. Palindromic Matrix 【暴力】
任意门:http://codeforces.com/contest/1118/problem/C C. Palindromic Matrix time limit per test 2 seconds ...
随机推荐
- Java中的内省
为什么要学内省? •开发框架时,经常需要使用java对象的属性来封装程序的数据,每次都使用反射技术完成此类操作过于麻烦,所以sun公司开发了一套API,专门用于操作java对象的属性. 什么是Ja ...
- HDU5716, HDU5745【dp+bitset】
DP+bitset HDU5716 dp[i][j] = dp[i-1][j-1] && (s[i] in set[j]); 第二维压bitset #include <bits ...
- nodejs学习笔记<六>文件处理
nodejs处理文件模块:fs —> var fs = require(‘fs’); 读取文件:readFileSync & readFile 读取文件路径为绝对: 读取结果需要to ...
- poj3714Raid(平面最近点对)
链接 模板 稍加一点标记 模板 #include <iostream> #include<cstdio> #include<cstring> #include< ...
- poj1696Space Ant(逆时针螺旋形)
链接 贪心做法,没次找最外面的点,也就是相对前面那条线偏转角度最小的点,除第一个点需要找到最下面的点即Y坐标最小,其余的每次进行极角排序. #include <iostream> #inc ...
- poj1039Pipe(直线交点、叉积)
链接 之前刷poj计划时刷过,不过也没什么印象了.打铁还是趁热,还没热起来就放弃了,前面算是做了无用功,有如胡乱的看解题报告一样. 题目应该是比较经典的集合入门题,黑书上有一部分核心讲解. 题目中的最 ...
- 64位WIN7+oracle11g+plsql安装
64位WIN7+oracle11g+plsql安装 上部转自Oracle 11g R2 for Win7旗舰版(64位)的安装步骤 1.下载Oracle 11g R2 for Windows的版本 ...
- Html.Listbox的用法(实例)
homecontroller控制器中的index动作代码如下: public actionresult index() { list<selectlistitem& ...
- Js获取当前日期时间及格式化操作
var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份(4位,1 ...
- Java编程思想学习笔记_1(Java内存和垃圾回收)
1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...