题意
有一个数列其中的数都是由
中的数字组成的 并且知道对于数列
中的
中有哪些值不能取 现在讲数列中所有的数累乘起来 然后将每一种情况的情况累加起来
首先我们来看如果不去掉一些值怎么算
就是 这个对吧 其实这就是一个乘法分配律了,可以化成
然后我们就会发现 如果 第一个数字不能取1 就相当于少了
这一段 那么化出来来就是
了
好了 到现在就很明显了 首先将 算出来 然后如果有全部都能取的就都是
如果有不能取的 就用
减掉那个 然后再累成上去
code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef long double ld;
const ll MOD = 1e9 + 7;
inline ll read() { ll s = 0, w = 1; char ch = getchar(); for (; !isdigit(ch); ch = getchar()) if (ch == '-') w = -1; for (; isdigit(ch); ch = getchar()) s = (s << 1) + (s << 3) + (ch ^ 48); return s * w; }
const int N = 1e5 + 7;
const int INF = 0x3f3f3f3f;
ll qpow(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans *= a; b >>= 1; a *= a; } return ans; } ll qpow(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1)(ans *= a) %= mod; b >>= 1; (a *= a) %= mod; }return ans % mod; }
struct node{
ll id , val;
}a[N];
ll c[N];
bool cmp(node a , node b){
if(a.id == b.id) return a.val < b.val;
return a.id < b.id;
}
void solve(){
ll n = read() , m = read() , k = read();
for(ll i = 1 ; i <= k ; ++i){
a[i].id = read();
a[i].val = read();
}
sort(a + 1 , a + k + 1 , cmp);
ll sum = (n * (n + 1)) % MOD / 2 % MOD;
ll ans = 1;
ll tot = 0;
for(ll i = 1 ; i <= k ; ++i){
if(a[i - 1].id != a[i].id){
c[++tot] = sum;
}
else{
if(a[i - 1].val == a[i].val) continue;
}
c[tot] = ((c[tot] - a[i].val) % MOD + MOD) % MOD;
}
ans = qpow(sum , m - tot , MOD);
for(ll i = 1 ; i <= tot ; ++i){
ans = (ans * c[i] % MOD + MOD) % MOD;
}
cout<<ans<<endl;
}
int main(void){
solve();
return 0;
} 
京公网安备 11010502036488号