记录编号 144213 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]排斥反应 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 5.805 s
提交时间 2014-12-21 12:24:59 内存使用 0.32 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
typedef long long LL;
const LL MOD=19921107;
const int MAXP=10,SIZES=130;
class Matrix{
public:
	int n,m;
	LL s[SIZES][SIZES];
	void clear(int n_,int m_){
		n=n_,m=m_;
		memset(s,0,sizeof(s));
	}
	void clear_I(int n_){
		clear(n_,n_);
		for(int i=0;i<n;i++) s[i][i]=1;
	}
	void print(void){
		cout<<"size: "<<n<<" "<<m<<endl;
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				cout<<s[i][j]<<" ";
			}
			cout<<endl;
		}
		cout<<endl;
	}
};
Matrix operator * (Matrix a,Matrix b){
	Matrix c;
	c.n=a.n,c.m=b.m;
	for(int i=0;i<c.n;i++){
		for(int j=0;j<c.m;j++){
			c.s[i][j]=0;
			for(int k=0;k<a.m;k++)
				c.s[i][j]=(c.s[i][j]+a.s[i][k]*b.s[k][j])%MOD;
		}
	}
	return c;
}
Matrix quickpow(Matrix a,int n){
	Matrix ans;ans.clear_I(a.n);
	while(n){
		if(n&1) ans=ans*a;
		a=a*a;
		n>>=1;
	}
	return ans;
}
int P,Q;
int id[1<<MAXP],S[SIZES];
int stot=0;
inline int getdig(int s,int i){
	return (s>>i)&1;
}
Matrix Make_D(void){
	Matrix D;
	D.clear(stot,stot);
	for(int i=0;i<stot;i++){
		for(int j=0;j<stot;j++){
			if(S[i]&S[j]) continue;
			D.s[i][j]=1;
		}
	}
	return D;
}
void work(void){
	if(Q==1){
		printf("%d\n",stot);
		return;
	}
	Matrix D=Make_D();
	D=quickpow(D,Q-1);
	LL ans=0;
	for(int i=0;i<stot;i++){
		for(int j=0;j<stot;j++){
			if(S[i]&S[j]) continue;
			ans+=D.s[i][j];
			ans%=MOD;
		}
	}
	printf("%lld\n",ans);
}
void DFS(int x,int nows){
	if(x==P){
		if(P>1&&getdig(nows,0)&&getdig(nows,P-1)) return;
		id[nows]=stot;
		S[stot]=nows;
		stot++;
		return;
	}
	if(!getdig(nows,0))	DFS(x+1,(nows<<1)|1);
	DFS(x+1,nows<<1);
}
int main(){
	freopen("react.in","r",stdin);
	freopen("react.out","w",stdout);
	scanf("%d%d",&P,&Q);
	memset(id,-1,sizeof(id));
	DFS(0,0);
	work();
	return 0;
}