Submission #1775299


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int p=1e9+7;
inline void inc(int &x,int y){x+=y;if (x>=p) x-=p;}
inline int mul(int x,int y){return (ll)x*y%p;}
int power(int x,int y){
	int ans=1;
	for (;y;y>>=1,x=mul(x,x))
		if (y&1) ans=mul(ans,x);
	return ans;
}
int n,m,ans,go[20][20],a[16],bit[16];
int q[16][16],deg[16];
void init(ll S){for (int i=0;i<15;i++) a[i]=S&15,S>>=4;}
struct hash_table{
	typedef unsigned long long ull;
	typedef pair<ll,int> pii;
	vector<pii> a;
	void init(int size){
		a.resize(size,pii(-1,0));
	}
	int& operator [] (ll x){
		ull key=x^531515465ll;
		key^=key<<13;
		key^=key>>17;
		key^=key<<5;
		vector<pii>::iterator p=a.begin()+key%a.size();
		while (~p->first&&p->first!=x){
			++p;
			if (p==a.end()) p=a.begin();
		}
		p->first=x;
		return p->second;
	}
}M[20];
//map<ll,int> M[20];
unsigned long long add;int add_cnt=0;
inline void work2(int v){
	register char j;
	static char cnt1[16];
	memset(cnt1,0,16);
	for (j=0;j<deg[n-1];j++) cnt1[a[q[n-1][j]]]++;
	static char cnt2[16];
	memset(cnt2,0,16);
	for (j=0;j<deg[n-2];j++) cnt2[a[q[n-2][j]]]++;
	static char suf[16];
	suf[15]=0;
	for (j=14;j>=0;j--) suf[j]=suf[j+1]+cnt1[j]+cnt2[j];
	for (j=0;v;j++){
		add+=((ll)v<<suf[j+1]);
		add_cnt++;
		if (add_cnt==32) ans=(ans+add)%p,add_cnt=0,add=0;
		v=mul(v,bit[cnt1[j]]*bit[cnt2[j]]);
	}
}
void work1(int v){
	static char cnt[16],suf[16];
	static char i=n-3,j,lim=0;
	memset(cnt,0,16);
	for (j=0;j<i;j++) if (go[i][j]) cnt[a[j]]++;
	for (j=14;j>=0;j--) suf[j]=suf[j+1]+cnt[j];
	while (cnt[lim]) lim++;
	for (int j=0;j<=lim;j++){
		a[i]=j;
		work2(mul(v,1<<suf[j+1]));
		v=mul(v,bit[cnt[j]]);
	}
}
char cnt[20],suf[20];
int main()
{
	//freopen("a.txt","r",stdin);
	for (int i=0;i<16;i++) bit[i]=(1<<i)-1;
	scanf("%d%d",&n,&m);
	for (int i=1;i<=m;i++){
		int u,v;
		scanf("%d%d",&u,&v);
		u=n-u;v=n-v;
		go[u][v]=1;
		if (v!=n-2) q[u][deg[u]++]=v;
	}
	for (int i=0;i<=9;i++) M[i].init(2e5);
	M[10].init(1e6);
	M[11].init(6e6);
	M[0][0]=1;
	for (int i=0;i<11;i++)
	for (auto pr:M[i].a)
	if (~pr.first){
		register int v=pr.second;
		register ll S=pr.first;
		init(S);
		register char j,lim=0;
		memset(cnt,0,12);
		for (j=0;j<=i;j++) if (go[i+1][j]) cnt[a[j]]++;
		for (j=11;j>=0;j--) suf[j]=suf[j+1]+cnt[j];
		while (cnt[lim]) lim++;
		for (char j=0,bit=(i+1)<<2;j<=lim;j++){
			inc(M[i+1][(ll)j<<bit|S],mul(v,1<<suf[j+1]));
			v=mul(v,(1<<cnt[j])-1);
		}
	}
	if (n<=12){
		for (auto pr:M[n-1].a)
		if (~pr.first){
			int v=pr.second;ll S=pr.first;
			init(S);
			if (a[n-1]!=a[n-2]) inc(ans,v);
		}
		printf("%d\n",ans);
	}
	else{
		for (auto pr:M[n-4].a)
		if (~pr.first) init(pr.first),work1(pr.second);
		ans=(ans+add)%p;
		ans=(power(2,m)+p-ans)%p;
		printf("%d\n",ans);
	}
	return 0;
}

Submission Info

Submission Time
Task F - Games on DAG
User FoolMike
Language C++14 (GCC 5.4.1)
Score 1600
Code Size 2870 Byte
Status AC
Exec Time 4758 ms
Memory 141056 KB

Compile Error

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

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 49 ms 140928 KB
0_01.txt AC 50 ms 140928 KB
0_02.txt AC 49 ms 140928 KB
0_03.txt AC 50 ms 140928 KB
1_00.txt AC 50 ms 140928 KB
1_01.txt AC 57 ms 140928 KB
1_02.txt AC 56 ms 140928 KB
1_03.txt AC 4758 ms 140928 KB
1_04.txt AC 2850 ms 140928 KB
1_05.txt AC 4741 ms 140928 KB
1_06.txt AC 684 ms 140928 KB
1_07.txt AC 1335 ms 140928 KB
1_08.txt AC 4674 ms 140928 KB
1_09.txt AC 2027 ms 140928 KB
1_10.txt AC 2680 ms 140928 KB
1_11.txt AC 1662 ms 140928 KB
1_12.txt AC 3489 ms 140928 KB
1_13.txt AC 2768 ms 140928 KB
1_14.txt AC 3929 ms 140928 KB
1_15.txt AC 1205 ms 140928 KB
1_16.txt AC 1008 ms 140928 KB
1_17.txt AC 4245 ms 140928 KB
1_18.txt AC 324 ms 140928 KB
1_19.txt AC 4080 ms 140928 KB
1_20.txt AC 56 ms 140928 KB
1_21.txt AC 81 ms 141056 KB
1_22.txt AC 69 ms 140928 KB
1_23.txt AC 134 ms 140928 KB
1_24.txt AC 50 ms 140928 KB
1_25.txt AC 51 ms 140928 KB
1_26.txt AC 447 ms 140928 KB
1_27.txt AC 64 ms 140928 KB
1_28.txt AC 56 ms 140928 KB
1_29.txt AC 282 ms 140928 KB
1_30.txt AC 56 ms 140928 KB
1_31.txt AC 1375 ms 140928 KB
1_32.txt AC 327 ms 140928 KB
1_33.txt AC 60 ms 140928 KB
1_34.txt AC 61 ms 140928 KB
1_35.txt AC 152 ms 140928 KB