NOIP T2 WA60求调

https://www.luogu.com.cn/problem/P11362

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5,Mod=1e9+7;
struct node
{
	int x,y;
}a[N];
int t,n,m,v,ans;
bool flag;
int qpow(int x,int y)
{
	if(y==0) return 1;
	if(y==1) return x%Mod;
	int t=qpow(x,y/2)%Mod;
	return y%2?t*t%Mod*x%Mod:t*t%Mod;
}
int calc(int x)//calc(x)表示区间长度可以放下x个二元限制时两端有限制的方案数 
{
	int p=0;
	p+=qpow(v,2*x);
	p%=Mod;
	p-=qpow(v,x);
	p%=Mod;
	p+=qpow(v,x-1); 
	return p%Mod;
}
bool cmp(node x,node y)
{
	return x.x<y.x;
}
signed main()
{
	cin>>t;
	while(t--)
	{
		ans=1,flag=1;
		cin>>n>>m>>v;
		for(int i=1;i<=m;++i) cin>>a[i].x>>a[i].y;
		sort(a+1,a+1+m,cmp);
		for(int i=2;i<=m;++i)
		{
			if(a[i-1].x==a[i].x&&a[i-1].y!=a[i].y)//如果出现位置相同但是值不同,那么无解 
			{
				flag=0;
				cout<<0<<endl;
				break;
			}
			if(a[i-1].x==a[i].x) continue;//要去重 
			ans=ans*calc(a[i].x-a[i-1].x)%Mod;//处理中间 
		}
		if(!flag) continue;
		ans=ans*qpow(v,2*(a[1].x-1))%Mod;//处理开头 
		ans=ans*qpow(v,2*(n-a[m].x))%Mod;//处理结尾 
		cout<<ans<<endl; 
	}
	return 0;
}

已经对了,计算时有减法要特殊取模