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;
}