涂抹果酱

#include <iostream>
#include <cstdio> 
using namespace std;
inline int read()
{
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')  f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return f*x;
}
const int N=1e4+5,M=50,mod=1e6;
int three[10],a[M][10],b[M],num,c[10],v[500];
int s,dp[N][M],ans,n,m,k;
bool ok[M][M];
int main()
{
	n=read(); m=read();  k=read();
	three[0]=1;
	for(int i=1;i<=m;i++)  three[i]=three[i-1]*3;
	for(int i=0;i<three[m];i++)
	{
		int x=i,p=0;
		while(x)
		{
			c[++p]=x%3;
			x/=3;
		}
		bool flag=1;
		for(int j=1;j<m;j++)
		  if(c[j]==c[j+1])
		  {
		  	flag=0;
		  	break;
		  }
		if(!flag)  continue;
		b[++num]=i;
		v[i]=num;
		for(int j=1;j<=m;j++)  a[num][j]=c[j];
	}
	for(int i=1;i<=num;i++)
	  for(int j=1;j<i;j++)
	  {
		bool flag=1;
		for(int k=1;k<=m;k++)
		  if(a[i][k]==a[j][k])
		  {
		  	flag=0;
		  	break;
		  }
		if(flag)  ok[i][j]=ok[j][i]=1;
	  }
	for(int i=1;i<=m;i++)
	{
		c[i]=read();
		s+=(c[i]-1)*three[i-1];
	}
	if(!v[s])
	{
		cout<<0;
		return 0;
	}
	if(k==1)  dp[1][v[s]]=1;
	else  for(int i=1;i<=num;i++)  dp[1][i]=1;
	for(int l=2;l<=n;l++)
	  if(l==k)
	  {
	  	for(int j=1;j<=num;j++)
	  	  if(ok[j][v[s]])
		    dp[l][v[s]]=(dp[l][v[s]]+dp[l-1][j])%mod;
	  }
	  else
	  {
	  	for(int i=1;i<=num;i++)
	      for(int j=1;j<=num;j++)
	        if(ok[i][j])
	          dp[l][i]=(dp[l][i]+dp[l-1][j])%mod;
	  }
	for(int i=1;i<=num;i++)
	  ans=(ans+dp[n][i])%mod;
	cout<<ans;
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值