思路:简单的插头DP,计算2^m个状态之间的转移,转换成矩阵乘法。
n很大,用快速幂加速下。做了这么多E题,这题应该算是最简单的了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
#define MOD 1000000007
#define MM 7
int a[1<<MM][1<<MM];
long long n;
int m;
#define VACANT(S,u) (u>=0 && u<m && ((S&(1<<u))==0))
int SETADD(int S,int u1,int u2=-1){
S|=1<<u1;
if(u2!=-1) S|=1<<u2;
return S;
}
int c[1<<MM][1<<MM];
void mat_mul(int a[][1<<MM],int b[][1<<MM],int sz=1<<m){
memset(c,0,sizeof(c));
for (int i=0;i<sz;i++)
for (int j=0;j<sz;j++)
for (int k=0;k<sz;k++){
c[i][j]=(c[i][j]+1ll*a[i][k]*b[k][j])%MOD;
}
for (int i=0;i<sz;i++)
for (int j=0;j<sz;j++)
a[i][j]=