60 pts 求条
查看原帖
60 pts 求条
763215
foglake楼主2024/12/4 19:38
#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);
	}
}

莫有注释,麻烦各位大佬力。

2024/12/4 19:38
加载中...