#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
int x=0,f=1;
char c=getchar();
while(c>57||c<48){
if(c==45)f=-1;
c=getchar();
}
while(c<=57&&c>=48){
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
const int N=1e6+2,P=1e9+7;
int T,n,m,v,f[N][2],a[22],ap[22],live,ans;
void dfs(int g){
if(g==n){
++ans;
if(ans>=P)ans-=P;return;
}
for(int i=1;i<=v;++i){
for(int j=1;j<=v;++j){
if(a[g]==i&&j!=a[g+1]&&a[g+1])continue;
if(a[g]==i)a[g+1]=j;
dfs(g+1);
if(!ap[g+1])a[g+1]=0;
}
}
}
int sure(){
if(a[1])f[1][0]=1;
else f[1][0]=v;
f[1][1]=0;
for(int i=2;i<=n;++i){
int h=f[i-1][0]+f[i-1][1];
h%=P;
f[i][0]=v*(v-1)%P*h%P;
f[i][1]=h;
}
return (f[n][1]+f[n][0])%P;
}
signed main(){
T=read();
while(T--){
n=read();m=read();v=read();ans=0;live=1;
for(int i=1;i<=n;++i)a[i]=ap[i]=0;
while(m--){
int c=read(),d=read();
if(ap[c]&&d!=a[c])live=0;
a[c]=d;ap[c]=1;
}
if(!live){
printf("0\n");continue;
}
if(n<=12){
dfs(1);printf("%lld\n",ans);
continue;
}
printf("%lld\n",sure());
}
return 0;
}
此时性质A错了,且错误的原因为均输出0,而本来有解。 将if(!live)删除后性质A又对了。求助为什么QMQ。