fzu 1911 Construct a Matrix(矩阵快速幂+规律)

原创 2013年12月04日 23:24:20

题目链接:fzu 1911 Construct a Matrix


题目大意:给出n和m,f[i]为斐波那契数列,s[i]为斐波那契数列前i项的和。r = s[n] % m。构造一个r * r的矩阵,只能使用-1、0、1。使得矩阵的每行每列的和都不相同,输出方案,不行的话输出No。


解题思路:求r的话用矩阵快速幂求,每次模掉m,

{ {1, 1, 0}, {1, 0, 0}, {1, 1, 1} } * { f[i], f[i -1], s[i] } = { f[i + 1], f[i], s[i + 1] }.


然后求出r后,若r是奇数或0,则矩阵不存在;r为偶数时,只要按照规律建立矩阵就可以了。


#include <stdio.h>
#include <string.h>

const int M = 10;
const int N = 205;

int n, m, r;

struct Mul {
	int s[M][M];
	Mul() {	memset(s, 0, sizeof(s));	}
	Mul operator * (const Mul& c) {
		Mul ans;

		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++) {
				ans.s[i][j] = 0;
				for (int k = 0; k < 3; k++)
					ans.s[i][j] = (ans.s[i][j] + s[i][k] * c.s[k][j] ) % m;
			}
		}
		return ans;
	}

	void put() {
		for (int i = 0; i < 3; i++) {
			for (int j = 0; j < 3; j++)
				printf("%d ", s[i][j]);
			printf("\n");
		}
	}
};

Mul MulPow(Mul a, int t) {
	if (t == 1) return a;

	Mul x = MulPow(a, t / 2);

	x = x * x;

	if (t % 2) x = x * a;

	return x;
}

void init() {
	if (n > 2) {
		Mul a;
		a.s[0][0] = a.s[0][1] = a.s[1][0] = a.s[2][0] = a.s[2][1] = a.s[2][2] = 1;

		Mul ans = MulPow(a, n - 2);

		r = (ans.s[2][0] + ans.s[2][1] + ans.s[2][2] * 2) % m;
	} else if (n == 2) {
		r = 2 % m;
	} else if (n == 1) {
		r = 1;
	}
}

void solve() {
	if (r == 0 || r % 2)
		printf("No\n");
	else {
		int v[N][N];
		memset(v, -1, sizeof(v));
		printf("Yes\n");

		for (int i = 1; i <= r; i++) {
			int tmp;
			if (i % 2) {
				tmp = (r + i + 1) / 2;
				v[tmp][i] = 0;
			} else
				tmp = (r - i) / 2;
			for (int j = tmp + 1; j <= r; j++)
				v[j][i] = 1;
		}

		for (int i = 1; i <= r; i++) {
			for (int j = 1; j < r; j++)
				printf("%d ", v[i][j]);
			printf("%d\n", v[i][r]);
		}
	}
}

int main () {
	int cas;
	scanf("%d", &cas);
	for (int i = 1; i <= cas; i++) {
		scanf("%d%d", &n, &m);
		printf("Case %d: ", i);

		init();

		solve();	
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

矩阵快速幂求斐波那契数列(初学整理)

参考文章:                  http://blog.csdn.net/u013795055/article/details/38599321                  htt...
  • NYIST_TC_LYQ
  • NYIST_TC_LYQ
  • 2016年10月31日 13:27
  • 6604

java实现矩阵快速幂算法

java实现矩阵快速幂算法
  • y937498174
  • y937498174
  • 2015年04月24日 09:53
  • 1099

算法学习 - 快速幂和矩阵快速幂(复杂度Olog(n))C++实现

快速幂 快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。 快速幂实现原理 快速幂的原理比较好懂,就是说假如我们...
  • chenfs1992
  • chenfs1992
  • 2014年12月24日 22:51
  • 7684

fzu1911 (Construct a Matrix) 矩阵快速幂+构造

Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...
  • u013187393
  • u013187393
  • 2015年01月27日 18:25
  • 448

FZU 1911 矩阵快速幂

题意: 给一个n,让你输出一个S(n)*S(n)的矩阵 S(n)是前n项斐波那契的和%m 这个矩阵必须满足每一行和每一列中任意两个的和不能相等 思路: 奇数肯定是无解的,因为奇数总有一行是...
  • qq_27925701
  • qq_27925701
  • 2016年07月27日 18:25
  • 146

FZU 1911【矩阵快速幂】

题意: F(n)为斐波那契数列,S(n)为其前缀和,给你n,m,求S(n)%m的值作为矩阵边长,构造矩阵行和列的值都不相等 思路: = =、强行把两道题凑成一道题; 求斐波那契前缀和–矩阵快速...
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017年07月18日 20:51
  • 81

[矩阵快速幂] fzu 2117 特殊的数

题意: 中文题不解释 注意是n位数! 思路: 中文在群里问了大神们,终于领悟到这种递推的精华 对于给定的n都会包含有四种状态 0、7和9的个数都是奇数 1、7是奇数,9是偶数 2、7是...
  • wdcjdtc
  • wdcjdtc
  • 2014年11月18日 21:39
  • 525

FZU 1683 纪念SlingShot (简单的矩阵快速幂)

纪念SlingShot Description 已知 F(n)=3 * F(n-1)+2 * F(n-2)+7 * F(n-3),n>=3,其中F(0)=1,F(1)=3,...
  • qq_34374664
  • qq_34374664
  • 2016年10月15日 15:15
  • 324

FZU Problem 2198 快来快来数一数(矩阵快速幂 卡常数 +优化)

FZU Problem 2198 快来快来数一数(矩阵快速幂 卡常数 +优化)
  • u012860063
  • u012860063
  • 2015年10月06日 22:01
  • 705

FZU1683---纪念SlingShot(矩阵快速幂(数据劣质))

【题目来源】:https://vjudge.net/problem/FZU-1683 【题意】 题意就像题面描述。 【思路】 这道题和我上一道题Arc of Dream非常相似,并且我在那篇博...
  • duan_1998
  • duan_1998
  • 2017年07月07日 10:53
  • 95
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:fzu 1911 Construct a Matrix(矩阵快速幂+规律)
举报原因:
原因补充:

(最多只允许输入30个字)