BZOJ2751 [HAOI2012] 容易题(easy)
2018 年 03 月 14 日发布.
Description
一个长为$m$的序列,每个数是$0$到$n$;还有$k$个限制:$A_x \neq 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;
("%d%d%d", &n, &m, &k);
scanf= (LL)n * (n + 1) / 2 % mod;
n while (k--) {
("%d%d", &x, &y);
scanfif (!M.count(x)) {
[x] = n;
M[x] = std::set<int>();
MS}
if (!MS[x].count(y)) {
(M[x] -= y) %= mod;
[x].insert(y);
MS}
}
int ans = 1;
-= M.size();
m 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)
= (LL)ans * it->second % mod;
ans ("%d\n", (ans + mod) % mod);
printfreturn 0;
}