题意
有一个数列其中的数都是由中的数字组成的 并且知道对于数列中的中有哪些值不能取 现在讲数列中所有的数累乘起来 然后将每一种情况的情况累加起来
首先我们来看如果不去掉一些值怎么算
就是 这个对吧 其实这就是一个乘法分配律了,可以化成 然后我们就会发现 如果 第一个数字不能取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; }