HDU 4686 Arc of Dream (矩阵快速幂)

D - Arc of Dream
Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u

Description

An Arc of Dream is a curve defined by following function: 

where 
0 = A0 
i = a  i-1*AX+AY 
0 = B0 
i = b  i-1*BX+BY 
What is the value of AoD(N) modulo 1,000,000,007?
 

Input

There are multiple test cases. Process to the End of File. 
Each test case contains 7 nonnegative integers as follows: 

A0 AX AY 
B0 BX BY 
N is no more than 10  18, and all the other integers are no more than 2×10  9.
 

Output

For each test case, output AoD(N) modulo 1,000,000,007.
 

Sample Input

       
       
1 1 2 3 4 5 6 2 1 2 3 4 5 6 3 1 2 3 4 5 6
 

Sample Output

       
       
4 134 1902
 
矩阵快速幂的精华:跟求通项式一样,从底层向高层推
AoD(n) = AoD(n-1) + a(n)*b(n) = Aod(n-1) + AX*BX*a(n-1)*b(n-1) + AX*BY*a(n-1) + AY*BX*b(n-1) + AYBY
如此我们可以提取出一个矩阵B = [Aod(n-1) ,  a(n-1)*b(n-1) , a(n-1) , b(n-1) , 1].
那么接下来我们要构造矩阵就是让B变成我们想要的Aod(n)
10000
AX*BXAX*BX000
AX*BYAX*BYAX00
AY*BXAY*BX0BX0
AY*BYAY*BYAYBYAY*BY

找到了需要构造的矩阵A,Bn = A^(n-1) * B, Aod(n) = Bn[0][0]

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int mod = 1e9+ 7;
typedef long long LL;
typedef vector<LL>vec;
typedef vector<vec>mat;

mat mul(mat &A, mat &B) {//两个矩阵相乘
	mat C(A.size(), vec(B[0].size()));
	for(int i = 0; i < A.size(); i ++) {
		for(int k = 0; k < B.size(); k ++) {
			for(int j = 0; j < B[0].size(); j ++) {
				C[i][j] = (C[i][j] + A[i][k] * B[k][j]) % mod;
			}
		}
	}
	return C;
}

mat pow(mat A, LL n) {//矩阵快速幂
	mat B(A.size(), vec(A.size()));
	for(int i = 0; i < A.size(); i ++) B[i][i] = 1;
	while(n) {
		if(n & 1) B = mul(B, A);
		A = mul(A, A);
		n >>= 1;
	}
	return B;
}
LL N ,A0, AX, AY, B0,BX, BY;
int main() {
	while(~scanf("%I64d%I64d%I64d%I64d%I64d%I64d%I64d",&N ,&A0, &AX, &AY, &B0, &BX, &BY)) {
		if(N == 0) {
			printf("0\n");
			continue;
		}
		mat A(5, vec(5)), B(1, vec(5));
		A[0][0] = 1, A[0][1] = 0, A[0][2] = 0, A[0][3] = 0,A[0][4] = 0;
		A[1][0] = (AX * BX) % mod, A[1][1] = (AX * BX) % mod, A[1][2] = 0, A[1][3] = 0, A[1][4] = 0;
		A[2][0] = (AX * BY) % mod, A[2][1] = (AX * BY) % mod, A[2][2] = AX % mod, A[2][3] = 0, A[2][4] = 0;
		A[3][0] = (AY * BX) % mod, A[3][1] = (AY * BX) % mod, A[3][2] = 0, A[3][3] = BX % mod, A[3][4] = 0;
		A[4][0] = (AY * BY) % mod, A[4][1] = (AY * BY) % mod, A[4][2] = AY % mod, A[4][3] = BY % mod, A[4][4] = 1;
		B[0][0] = (A0 * B0) % mod, B[0][1] = (A0 * B0) % mod, B[0][2] = A0 % mod, B[0][3] = B0 % mod, B[0][4] = 1;
		A = pow(A, N - 1);
		B = mul(B, A);
		printf("%I64d\n", B[0][0]);
	}
	return 0;
}



数据治理是确保数据准确性、可靠性、安全性、可用性和完整性的体系和框架。它定义了组织内部如何使用、存储、保护和共享数据的规则和流程。数据治理的重要性随着数字化转型的加速而日益凸显,它能够提高决策效率、增强业务竞争力、降低风险,并促进业务创新。有效的数据治理体系可以确保数据在采集、存储、处理、共享和保护等环节的合规性和有效性。 数据质量管理是数据治理中的关键环节,它涉及数据质量评估、数据清洗、标准化和监控。高质量的数据能够提升业务决策的准确性,优化业务流程,并挖掘潜在的商业价值。随着大数据和人工智能技术的发展,数据质量管理在确保数据准确性和可靠性方面的作用愈发重要。企业需要建立完善的数据质量管理和校验机制,并通过数据清洗和标准化提高数据质量。 数据安全与隐私保护是数据治理中的另一个重要领域。随着数据量的快速增长和互联网技术的迅速发展,数据安全与隐私保护面临前所未有的挑战。企业需要加强数据安全与隐私保护的法律法规和技术手段,采用数据加密、脱敏和备份恢复等技术手段,以及加强培训和教育,提高安全意识和技能水平。 数据流程管理与监控是确保数据质量、提高数据利用率、保护数据安全的重要环节。有效的数据流程管理可以确保数据流程的合规性和高效性,而实时监控则有助于及时发现并解决潜在问题。企业需要设计合理的数据流程架构,制定详细的数据管理流程规范,并运用数据审计和可视化技术手段进行监控。 数据资产管理是将数据视为组织的重要资产,通过有效的管理和利用,为组织带来经济价值。数据资产管理涵盖数据的整个生命周期,包括数据的创建、存储、处理、共享、使用和保护。它面临的挑战包括数据量的快速增长、数据类型的多样化和数据更新的迅速性。组织需要建立完善的数据管理体系,提高数据处理和分析能力,以应对这些挑战。同时,数据资产的分类与评估、共享与使用规范也是数据资产管理的重要组成部分,需要制定合理的标准和规范,确保数据共享的安全性和隐私保护,以及建立合理的利益分配和权益保障机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值