记录编号 85348 评测结果 AAAAAAAAAA
题目名称 [SRM 377] 外星语言 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.004 s
提交时间 2014-01-01 21:32:41 内存使用 0.31 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#include<iomanip>
using namespace std;
typedef long long ll;
ll MOD;
const int SIZEN=4;
class MATRIX{
public:
	int n,m;//n行m列
	ll s[SIZEN][SIZEN];
	MATRIX(){//初始化为零
		m=n=0;
		memset(s,0,sizeof(s));
	}
	void print(void){//调试接口,输出矩阵
		cout<<"size:"<<n<<" "<<m<<endl;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++) cout<<s[i][j]<<" ";
			cout<<endl;
		}
	}
	void assign_one(int sn){//赋值为sn行的单位矩阵
		n=m=sn;
		for(int i=1;i<=n;i++) s[i][i]=1;
	}
};
MATRIX operator * (MATRIX a,MATRIX b){//矩阵乘法,结果对MOD取模
	MATRIX c;
	c.n=a.n;c.m=b.m;
	int i,j,k;
	for(i=1;i<=c.n;i++){
		for(j=1;j<=c.m;j++){
			c.s[i][j]=0;
			for(k=1;k<=a.m;k++){
				c.s[i][j]+=(a.s[i][k]*b.s[k][j])%MOD;
				c.s[i][j]%=MOD;
			}
			c.s[i][j]%=MOD;
		}
	}
	return c;
}
MATRIX quickpow(MATRIX a,ll n){//a^n,sn行/列
	MATRIX ans;ans.assign_one(a.n);
	while(n){
		if(n&1) ans=ans*a;
		a=a*a;
		n>>=1;
	}
	return ans;
}
ll calc(int N,int K){
	MATRIX I,D;
	I.n=1,I.m=3;
	I.s[1][1]=1,I.s[1][2]=K+1,I.s[1][3]=1;
	D.n=D.m=3;
	D.s[1][1]=K,D.s[1][2]=0,D.s[1][3]=0;
	D.s[2][1]=1,D.s[2][2]=K,D.s[2][3]=0;
	D.s[3][1]=0,D.s[3][2]=1,D.s[3][3]=1;
	I=I*quickpow(D,N);
	return I.s[1][1];
}
class AlienLanguage{//topcoder的格式要求
public:
	int getNumberOfWords(int,int,int,int);
};
int AlienLanguage::getNumberOfWords(int P,int Q,int N,int M){
	MOD=M;
	long double s=calc(N,P)*calc(N,Q);
	while(s>1e18&&s>=MOD) s-=MOD;
	ll ans=(ll) s;
	ans=(ans-1+MOD)%MOD;
	return (int)ans;
}
int main(){
	freopen("alienlanguage.in","r",stdin);
	freopen("alienlanguage.out","w",stdout);
	AlienLanguage test;
	int P,Q,N,M;
	cin>>P>>Q>>N>>M;
	cout<<test.getNumberOfWords(P,Q,N,M)<<endl;
	return 0;
}