30分的代码(纯暴力dfs,超时)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=1e9+7;
int n,m;
int op[7];
bool conflict[7][7];
ll f(int up,int cnt) //上层定好了朝上的数字为up的情况下,垒好cnt个骰子的方案数
{
if(cnt==0)
{
return 4;
}
ll ans=0;
for(int upp=1;upp<=6;upp++)
{
if(conflict[op[up]][upp])
{
continue;
}
ans=(ans+f(upp,cnt-1))%mod;
}
return ans;
}
void init()
{
op[1]=4;
op[2]=5;
op[3]=6;
op[4]=1;
op[5]=2;
op[6]=3;
}
int main()
{
init();
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
conflict[x][y]=1;
conflict[y][x]=1;
}
ll ans=0;
for(int up=1;up<=6;up++)
{
ans=(ans+4*f(up,n-1))%mod;
}
printf("%lld\n",ans);
}