特判无解导致性质A错了
查看原帖
特判无解导致性质A错了
999366
fujiahao7700楼主2024/11/30 21:02
#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。

2024/11/30 21:02
加载中...