Description
给出 个数字,每个数字范围是 的自然数,有 个限制
注意:
Solution
从数据范围得知要从 入手
若没有限制条件,则每一个位置都能放
答案为
可见每一个位置的地位都是相同的,限制条件只是改变某一个位置的值
但是实际上最多只能改变 个位置,剩下的 个位置直接用快速幂算就好了
于是记录这 个限制范围分别在哪一个数字上,由于位置的地位是相同的,不妨离散化一下
注意需要去重,直接用一个set存就好了
时间复杂度
Code
#include<bits/stdc++.h> typedef long long ll; using namespace std; const int N = 1e6 + 5; const int mod = 1000000007; ll qpow(ll a, ll b) { ll res = 1; while (b) { if (b & 1) { res = res * a % mod; } a = a * a % mod; b >>= 1; } return res; } set<int> G[100005]; void solve() { int n, m, k; cin >> n >> m >> k; map<int, int> mp; ll one = (1LL * n * (n + 1)) / 2 % mod; int cnt = 0; for (int i = 1; i <= k; i++) { int l, r; cin >> l >> r; if (!mp.count(l)) { mp[l] = ++cnt; } G[mp[l]].insert(r); } int last = m - cnt; ll ans = qpow(one, last); for (int i = 1; i <= cnt; i++) { ll cur = one; for (auto &it : G[i]) { cur = ((cur - it) % mod + mod) % mod; } ans = ans * cur % mod; } cout << ans << '\n'; } int main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int T = 1; //cin >> T; while(T--) { solve(); } return 0; }