Submission #1365507


Source Code Expand

#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <cstring>
#include <functional>
#include <queue>
#include <cmath>
#include <set>
#include <map>
#include <string>
#define SIZE 20
#define BT 1<<16
#define MOD 1000000007

using namespace std;
typedef long long int ll;
typedef pair <int,int> P;

ll dp[BT],rt[SIZE];
ll nxt[BT],memo[SIZE][SIZE];
ll cnt[SIZE][BT];
ll nt[BT];
bool use[SIZE][SIZE];


int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i=0;i<m;i++)
	{
		int x,y;
		scanf("%d %d",&x,&y);x--,y--;
		use[x][y]=true;
	}
	for(int i=0;i<n;i++)
	{
		for(int S=0;S<1<<n;S++)
		{
			cnt[i][S]=0;
			for(int j=0;j<n;j++)
			{
				if(use[i][j]&&(S>>j&1))
				{
					cnt[i][S]=(cnt[i][S]*2LL+1)%MOD;
				}
			}
		}
	}
	for(int S=0;S<1<<n;S++)
	{
		nt[S]=1;
		for(int i=0;i<n;i++)
		{
			if(S>>i&1)
			{
				for(int j=i+1;j<n;j++)
				{
					if(S>>j&1)
					{
						if(use[i][j]) nt[S]=nt[S]*2LL%MOD;
					}
				}
			}
		}
	}
	memset(dp,0,sizeof(dp));
	dp[0]=1;
	ll ret=0;
	for(int i=0;i<n;i++)
	{
		memset(nxt,0,sizeof(nxt));
		for(int S=0;S<1<<n;S++)
		{
			if(dp[S]==0) continue;
			int T=(1<<n)-S-1;
			for(int K=T;K>0;K=T&(K-1))
			{
				int zan=T-K;
				ll way=dp[S];
				for(int j=0;j<n;j++)
				{
					if(zan>>j&1)
					{
						way=way*cnt[j][K]%MOD;
					}
					else if(K>>j&1)
					{
						way=way*(cnt[j][zan]+1)%MOD;
					}
				}
				nxt[S+K]+=way;
				if(nxt[S+K]>=MOD) nxt[S+K]>=MOD;
				if((K>>0&1)&&(K>>1&1))
				{
					ret+=way*nt[zan]%MOD;
					if(ret>=MOD) ret-=MOD;
				}
			}
		}
		for(int S=0;S<1<<n;S++) dp[S]=nxt[S];
	}
	ll all=1;
	for(int i=0;i<m;i++) all=all*2LL%MOD;
	printf("%lld\n",(all-ret+MOD)%MOD);
	return 0;
}

Submission Info

Submission Time
Task F - Games on DAG
User yutaka1999
Language C++14 (GCC 5.4.1)
Score 1600
Code Size 1790 Byte
Status AC
Exec Time 629 ms
Memory 8320 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:30:22: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d",&n,&m);
                      ^
./Main.cpp:34:23: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d",&x,&y);x--,y--;
                       ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 1600 / 1600
Status
AC × 4
AC × 40
Set Name Test Cases
Sample 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt
All 0_00.txt, 0_01.txt, 0_02.txt, 0_03.txt, 1_00.txt, 1_01.txt, 1_02.txt, 1_03.txt, 1_04.txt, 1_05.txt, 1_06.txt, 1_07.txt, 1_08.txt, 1_09.txt, 1_10.txt, 1_11.txt, 1_12.txt, 1_13.txt, 1_14.txt, 1_15.txt, 1_16.txt, 1_17.txt, 1_18.txt, 1_19.txt, 1_20.txt, 1_21.txt, 1_22.txt, 1_23.txt, 1_24.txt, 1_25.txt, 1_26.txt, 1_27.txt, 1_28.txt, 1_29.txt, 1_30.txt, 1_31.txt, 1_32.txt, 1_33.txt, 1_34.txt, 1_35.txt
Case Name Status Exec Time Memory
0_00.txt AC 1 ms 1152 KB
0_01.txt AC 1 ms 1152 KB
0_02.txt AC 2 ms 3200 KB
0_03.txt AC 2 ms 3200 KB
1_00.txt AC 1 ms 1152 KB
1_01.txt AC 25 ms 8320 KB
1_02.txt AC 25 ms 8320 KB
1_03.txt AC 629 ms 8320 KB
1_04.txt AC 586 ms 8320 KB
1_05.txt AC 629 ms 8320 KB
1_06.txt AC 224 ms 8320 KB
1_07.txt AC 487 ms 8320 KB
1_08.txt AC 629 ms 8320 KB
1_09.txt AC 559 ms 8320 KB
1_10.txt AC 589 ms 8320 KB
1_11.txt AC 402 ms 8320 KB
1_12.txt AC 605 ms 8320 KB
1_13.txt AC 620 ms 8320 KB
1_14.txt AC 625 ms 8320 KB
1_15.txt AC 463 ms 8320 KB
1_16.txt AC 398 ms 8320 KB
1_17.txt AC 629 ms 8320 KB
1_18.txt AC 200 ms 8320 KB
1_19.txt AC 628 ms 8320 KB
1_20.txt AC 30 ms 8320 KB
1_21.txt AC 5 ms 5504 KB
1_22.txt AC 146 ms 8320 KB
1_23.txt AC 171 ms 8320 KB
1_24.txt AC 21 ms 7808 KB
1_25.txt AC 3 ms 5248 KB
1_26.txt AC 335 ms 8320 KB
1_27.txt AC 10 ms 7424 KB
1_28.txt AC 24 ms 8320 KB
1_29.txt AC 66 ms 7552 KB
1_30.txt AC 5 ms 7424 KB
1_31.txt AC 526 ms 8320 KB
1_32.txt AC 62 ms 7552 KB
1_33.txt AC 8 ms 7424 KB
1_34.txt AC 59 ms 7808 KB
1_35.txt AC 57 ms 7552 KB