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
2017-11-15 21:18:36+0900
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
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