记录编号 577951 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2013]矩阵游戏 最终得分 100
用户昵称 Gravataryrtiop 是否通过 通过
代码语言 C++ 运行时间 1.444 s
提交时间 2022-12-13 16:23:40 内存使用 1.91 MiB
显示代码纯文本
// Problem: P1397 [NOI2013] 矩阵游戏
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1397
// Memory Limit: 128 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
using i64 = long long;

const i64 mod = 1e9 + 7;
const int maxn = 1e6 + 5;
char s[maxn],t[maxn];
i64 a,b,c,d;
int n,m;

struct matrix {
	i64 g[2][2];
	matrix() {
		g[0][0] = g[0][1] = g[1][0] = g[1][1] = 0;
	}
	void init() {
		g[0][0] = g[1][1] = 1;
		return ;
	}
	matrix operator * (const matrix& p)const {
		matrix c;
		for(int k = 0;k < 2;++ k)
			for(int i = 0;i < 2;++ i)
				for(int j = 0;j < 2;++ j)
					(c.g[i][j] += g[i][k] * p.g[k][j]) %= mod;
		return c;
	}
}f,A;

i64 powersum(i64 x,char* y,int len) {
	i64 cur,ans = 1;
	for(int i = 1;i <= len;++ i) {
		for(int k = 1;k <= y[i];++ k)
			(ans *= x) %= mod;
		if(i == len)break ;
		(x *= x) %= mod;
		cur = x;
		(x *= x) %= mod;
		(x *= x) %= mod;
		(x *= cur) %= mod;
	}
	return ans;
}

i64 power(i64 x,i64 y) {
	i64 ans = 1;
	for(;y;y >>= 1) {
		if(y & 1)(ans *= x) %= mod;
		(x *= x) %= mod;
	}
	return ans;
}

void buc(char* s,int& len) {
	for(int i = 1;i <= len;++ i)
		s[i] ^= '0';
	-- s[1];
	for(int i = 1;i < len;++ i) {
		if(s[i] >= 0)break ;
		s[i] += 10;
		s[i + 1] --;
	}
	if(s[len] <= 0)-- len;
	return ;
}

matrix powermatrix(matrix x,char* y,int len) {
	matrix ans,cur;
	ans.init();
	for(int i = 1;i <= len;++ i) {
		for(int k = 1;k <= y[i];++ k)
			ans = ans * x;
		if(i == len)break ;
		x = x * x;
		cur = x;
		x = x * x;
		x = x * x;
		x = x * cur;
	}
	return ans;
}

int main() {
	freopen("matrixb.in","r",stdin);
	freopen("matrixb.out","w",stdout);
	scanf("%s %s %lld %lld %lld %lld",s + 1,t + 1,&a,&b,&c,&d);
	n = strlen(s + 1);
	m = strlen(t + 1);
	std::reverse(s + 1 , s + 1 + n);
	std::reverse(t + 1 , t + 1 + m);
	buc(s , n);
	buc(t , m);
	i64 x;
	if(a > 1)x = (powersum(a , t , m) - 1) * power(a - 1 , mod - 2) % mod;
	else {
		x = 0;
		for(int i = m;i;-- i)
			x = (x * 10 % mod + t[i]) % mod;
	}
	f.g[0][0] = (powersum(a , t , m) + x * b % mod) % mod;
	f.g[0][1] = 1;
	A.g[0][0] = powersum(a , t , m) * c % mod;
	A.g[0][1] = 0;
	A.g[1][0] = (powersum(a , t , m) * d % mod + x * b % mod) % mod;
	A.g[1][1] = 1;
	printf("%lld",(f * powermatrix(A , s , n)).g[0][0]);
	return 0;
}