记录编号 304386 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2013]矩阵游戏 最终得分 100
用户昵称 GravatarFoolMike 是否通过 通过
代码语言 C++ 运行时间 13.078 s
提交时间 2016-09-08 13:06:29 内存使用 2.20 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
using namespace std;
const int p=1000000007,N=1000010;
struct matrix{
	long long a[2][2];
	matrix(){memset(a,0,sizeof a);}
	matrix(int A,int b,int c,int d){
		a[0][0]=A;a[0][1]=b;
		a[1][0]=c;a[1][1]=d;
	}
	bool empty(){
		return (a[0][0]|a[0][1]|a[1][0]|a[1][1])==0;
	}
	matrix operator * (const matrix &x){
		if (empty()) return x;
		matrix ans;
		for (int i=0;i<2;i++)
		for (int j=0;j<2;j++)
		for (int k=0;k<2;k++)
			ans.a[i][j]=(ans.a[i][j]+a[i][k]*x.a[k][j])%p;
		return ans;
	}
}ans(1,1,1,1),Mi,x,y;
matrix mi(matrix x,char *s){
	int l=strlen(s);
	matrix ans,m[11];
	for (int i=l-1;i>=0;i--){
		for (int j=1;j<10;j++) m[j]=m[j-1]*x;
		if (s[i]>'0') ans=ans*m[s[i]-'0'];
		x=m[9]*x;
	}
	return ans;
}
char n[N],m[N];
int a,b,c,d,ln,lm;
int main()
{
	freopen("matrixb.in","r",stdin);
	freopen("matrixb.out","w",stdout);
	scanf("%s%s%d%d%d%d",n,m,&a,&b,&c,&d);
	int i=strlen(n)-1,j=strlen(m)-1;
	while (n[i]=='0') n[i]='9',i--;n[i]--;
	while (m[j]=='0') m[j]='9',j--;m[j]--;
	x=matrix(a,0,b,1);Mi=mi(x,m);
	ans=ans*Mi;
	x=matrix(c,0,d,1)*Mi;
	ans=ans*mi(x,n);
	printf("%lld\n",ans.a[0][0]);
	return 0;
}