Description
一个长为(m)的序列,每个数是(0)到(n);还有(k)个限制:(A_x eq y);求所有可能序列的乘积的和。
Solution
和题目标题一样==。注意判重。
Code
#include <algorithm>
#include <cstdio>
#include <map>
#include <set>
typedef long long LL;
const int mod = 1000000007;
std::map<int, int> M;
std::map<int, std::set<int> > MS;
int main() {
int n, m, k, x, y;
scanf("%d%d%d", &n, &m, &k);
n = (LL)n * (n + 1) / 2 % mod;
while (k--) {
scanf("%d%d", &x, &y);
if (!M.count(x)) {
M[x] = n;
MS[x] = std::set<int>();
}
if (!MS[x].count(y)) {
(M[x] -= y) %= mod;
MS[x].insert(y);
}
}
int ans = 1;
m -= M.size();
for (; m; m >>= 1, n = (LL)n * n % mod)
if (m & 1) ans = (LL)ans * n % mod;
for (std::map<int, int>::iterator it = M.begin(); it != M.end(); ++it)
ans = (LL)ans * it->second % mod;
printf("%d
", (ans + mod) % mod);
return 0;
}