数学模板

1. 矩阵快速幂
const (
	N   = 10    // 矩阵大小
	Mod = 10007 // 模
)

// Matrix 矩阵定义
type Matrix struct {
	mat [N][N]int
}

var E Matrix

func init() {
	E.Unit()
}

func (m *Matrix) Zero() {
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			m.mat[i][j] = 0
		}
	}
}

func (m *Matrix) Unit() {
	for i := 0; i < N; i++ {
		m.mat[i][i] = 1
		for j := 0; j < N; j++ {
			if i != j {
				m.mat[i][j] = 0
			}
		}
	}
}

func Add(a, b Matrix) Matrix {
	var c Matrix
	c.Zero()
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			c.mat[i][j] = (a.mat[i][j] + b.mat[i][j]) % Mod
		}
	}
	return c
}

func Mul(a, b Matrix) Matrix {
	var c Matrix
	c.Zero()
	for i := 0; i < N; i++ {
		for j := 0; j < N; j++ {
			for k := 0; k < N; k++ {
				c.mat[i][j] = (c.mat[i][j] + a.mat[i][k]*b.mat[k][j]) % Mod
			}
		}
	}
	return c
}

// a ^ x
// 二分求解
func Pow(a Matrix, x int) Matrix {
	var c Matrix
	c.Unit()
	for x > 0 {
		if x&1 > 0 {
			c = Mul(c, a)
		}
		a = Mul(a, a)
		x >>= 1
	}
	return c
}

// a^1 + a^2 + ... + a^x
// 二分求解
func PowSum(a Matrix, x int) Matrix {

	if x == 1 {
		return a
	}

	if x%2 == 0 {
		return Mul(PowSum(a, x/2), Add(E, Pow(a, x/2)))
	}

	return Add(Pow(a, x), PowSum(a, x-1))
}

PS: 广义上的矩阵操作,而不是仅仅局限于加法和乘法操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
2019年MathorCup高校数学建模挑战赛D题 2019年第九届MathorCup高校数学建模挑战赛 竞赛信息 竞赛简介 为了培养学生的创新意识及运用数学方法和计算机技术解决实际问题的能力,中国优选法统筹法与经济数学研究会决定主办2019年第九届MathorCup高校数学建模挑战赛,欢迎各高等院校按照竞赛章程及有关规定组织同学报名参赛。 组织机构 主办单位:中国优选法统筹法与经济数学研究会 【中国优选法统筹法与经济数学研究会是在中国科学技术协会直接领导下的学术性社会团体,是国家一级学会。学会由华罗庚教授于1981年发起成立,至今成立了评价方法与应用、项目管理、计算机模拟、统筹、管理决策与信息系统、工业工程、高等教育管理、数学教育、经济数学与管理数学、应急管理、灰色系统研究,复杂系统研究等十余个专业分会】 竞赛时间 报名时间:即日起至2019年 4 月 10日 12:00 竞赛时间:2019年4 月 11 日08:00至2019年 4 月 15 日08:00 参赛对象 普通高校全日制在校生(研究生、本科生、专科生)以队为单位参赛,每队不超过3人,不允许跨校组队参赛。 参赛费用 每支队伍需缴纳200元的报名费用。 奖项设置 参赛队伍:全国一等奖(约5%)、全国二等奖(约15%)、全国三等奖(约30%),从一等奖队伍中经过决赛答辩决出4支队伍获得“MathorCup”荣誉奖杯; 组织单位:优秀组织单位、优秀组织社团、优秀组织个人; 其它奖励政策:参见《 MathorCup高校数学建模挑战赛奖励细则》( 可从官方主页下载)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值