제출 #1349140

#제출 시각아이디문제언어결과실행 시간메모리
1349140Faisal_SaqibPlus Minus (BOI17_plusminus)C++17
0 / 100
0 ms344 KiB
#include <iostream>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll powmod(ll a,ll b)
{
	ll p=1;
	while(b)
	{
		if(b&1)p=(p*a)%mod;
		b>>=1;
		a=(a*a)%mod;
	}
	return p;
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	ll n,m,k;
	cin>>n>>m>>k;
	ll ans=0;
	if(n==1)
	{
		cout<<powmod(2,m-k)<<endl;
	}
	else if(m==1)
	{
		cout<<powmod(2,n-k)<<endl;
	}
	else if (min(n,m)<3)
	{
		int x[k],y[k];
		char c[k],a[n][m];
		for(int i=0;i<k;i++)cin>>c[i]>>x[i]>>y[i],x[i]--,y[i]--;
		// 2<=n,m
		for(int mk=0;mk<(1<<(n*m));mk++)
		{
			for(int i=0;i<n;i++)
			{
				for(int j=0;j<m;j++)
				{
					a[i][j]=(((mk>>(i*m+j))&1)?'+':'-');
				}
			}
			bool fl=1;
			for(int i=0;i<k;i++)
			{
				if(a[x[i]][y[i]]!=c[i])
				{
					fl=0;
				}
			}
			for(int i=0;i+1<n;i++)
			{
				for(int j=0;j+1<m;j++)
				{
					fl&=((a[i][j]=='+')+(a[i][j+1]=='+')+(a[i+1][j]=='+')+(a[i+1][j+1]=='+') == 2);
				}
			}
			ans+=fl;
		}
	}
		else
		{
		  int x[k],y[k];
  		char c[k],a[2][2];
  		for(int i=0;i<k;i++)cin>>c[i]>>x[i]>>y[i],x[i]--,y[i]--;
		  for(int mk=0;mk<(1<<4);mk++)
  		{
  			a[0][0]=((mk&1)?'+':'-');
  			a[0][1]=((mk&2)?'+':'-');
  			a[1][0]=((mk&4)?'+':'-');
  			a[1][1]=((mk&8)?'+':'-');
  			bool fl=((a[0][0]=='+')+(a[0][1]=='+')+(a[1][0]=='+')+(a[1][1]=='+') == 2); // only 2 + and 2 -
  			for(int i=0;i<k;i++)
  			{
  				if(a[x[i]%2][y[i]%2]!=c[i])
  				{
  					fl=0;
  				}
  			}
  			ans+=fl;
  		}		  
		}
		cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...