记录编号 154700 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [NOI 2013]矩阵游戏 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.144 s
提交时间 2015-03-24 06:27:12 内存使用 4.13 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>

typedef unsigned long long int64;

const int64 p=1000000007ULL;

using namespace std;

void Mread(int64 &x){
	char ch;
	while(ch=getchar(),!isdigit(ch));
	x=ch-'0';
	while(ch=getchar(),isdigit(ch)){
		x=10LL*x+(int64)(ch-'0');
		if(x>=(p-1)) x%=(p-1);
	}
}

struct MA{
	int n,m;
	int64 a[3][3];
	inline void init(int nt,int mt){
		n=nt; m=mt;
		memset(a,0,sizeof(a));
	}
	inline MA operator*(const MA &x)const{
		MA re; re.init(n,x.m);
		int i,j,k;
		for(i=1;i<=re.n;i++)
			for(j=1;j<=re.m;j++)
				for(k=1;k<=m;k++){
					re.a[i][j]+=a[i][k]*x.a[k][j];
					if(re.a[i][j]>=p) re.a[i][j]%=p;
				}
		return re;
	}
	inline void print(){
		cout<<"Matrix : "<<n<<' '<<m<<endl;
		int i,j;
		for(i=1;i<=n;i++){
			for(j=1;j<=m;j++)
				cout<<a[i][j]<<' ';
			cout<<endl;
		}
	}
}A,B,Ans;

int64 n,m;
char s1[2000010],s2[2000010];

inline MA qpow(const MA &x,int64 n){
	MA re,tp=x; re.init(2,2);
	for(int i=1;i<=2;i++) re.a[i][i]=1LL;
	for(;n;n>>=1,tp=tp*tp) if(n&1) re=re*tp;
	return re;
}

int main(){
	freopen("matrixb.in","r",stdin);
	freopen("matrixb.out","w",stdout);
	scanf("%s%s",s1,s2);
	int64 mo=p-1;
	A.init(2,2);
	B.init(2,2);
	Ans.init(1,2);
	Ans.a[1][1] = Ans.a[1][2] = 1;
	A.a[2][2] = B.a[2][2] = 1;
	scanf("%llu%llu%llu%llu",
		&A.a[1][1],&A.a[2][1],&B.a[1][1],&B.a[2][1]);
	if(A.a[1][1]==1&&B.a[1][1]==1) mo=p;
	n=0;
	for(int i=0,ln=strlen(s1);i<ln;i++)
		n=(10LL*n+s1[i]-'0')%mo;
	m=0;
	for(int i=0,ln=strlen(s2);i<ln;i++)
		m=(10LL*m+s2[i]-'0')%mo;
	if(n==0) n=mo;
	if(m==0) m=mo;
	A=qpow(A,m-1);
	B=A*B;
	B=qpow(B,n-1);
	B=B*A;
	Ans=Ans*B;
	printf("%llu\n",Ans.a[1][1]);
	return 0;
}