#include <bits/stdc++.h>
using namespace std;
const int mod = 1e9 + 7;
pair <int, int> p[100010];
long long Pow(long long x, int po) {
long long ans = 1;
while (po) {
if (po & 1) ans = (ans * x) % mod;
po /= 2, x = (x * x) % mod;
}
return ans;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
int n, m, v;
long long ans = 1;
bool sol = 1;
scanf("%d%d%d", &n, &m, &v);
for (int i = 1; i <= m; i++) {
int l, num;
scanf("%d%d", &l, &num);
p[i].first = l, p[i].second = num;
}
sort(p + 1, p + 1 + m); //排序方便判有解
for (int i = 1; i < m; i++)
if (p[i].first == p[i + 1].first && p[i].second != p[i + 1].second) {
sol = 0;
break;
}
if (!sol) {
printf("0\n");
continue;
}
ans = (ans * Pow(v, (p[1].first - 1) << 1)) % mod;
for (int i = 1; i < m; i++) {
if (p[i + 1].first == p[i].first) continue;
ans = (ans * (((long long)Pow(v, (p[i + 1].first - p[i].first) << 1) - (long long)Pow(v, p[i + 1].first - p[i].first - 1) * (v - 1) + mod) % mod)) % mod;
}
ans = (ans * (long long)Pow(v, (n - p[m].first) << 1)) % mod;
printf("%lld\n", ans);
}
}
莫有注释,麻烦各位大佬力。