列表

详情


NC19989. [HAOI2012]容易题(EASY)

描述

为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 
有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵!

输入描述

第一行三个整数n,m,k分别表示数列元素的取值范围,数列元素个数,以及已知的限制条数。
接下来k行,每行两个正整数x,y表示A[x]的值不能是y。

输出描述

一行一个整数表示所有可能的数列的积的和对1000000007取模后的结果。如果一个合法的数列都没有,答案输出0。

示例1

输入:

3 4 5
1 1
1 1
2 2
2 3
4 3

输出:

90

说明:

样例解释
A[1]不能取1
A[2]不能去2、3
A[4]不能取3
所以可能的数列有以下12种
数列 积
2 1 1 1 2
2 1 1 2 4
2 1 2 1 4
2 1 2 2 8
2 1 3 1 6
2 1 3 2 12
3 1 1 1 3
3 1 1 2 6
3 1 2 1 6
3 1 2 2 12
3 1 3 1 9
3 1 3 2 18

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 420ms, 内存消耗: 59728K, 提交时间: 2022-04-22 15:56:30

import sys
from collections import defaultdict

def read_ints():
    return map(int, sys.stdin.readline().split())

def binPow(a, n, m):
    res = 1
    while n:
        if n & 1:
            res = res * a % m
        a = a * a % m
        n >>= 1
    return res

MOD = 10 ** 9 + 7
n, m, k = read_ints()

dl = defaultdict(set)

for i in range(k):
    x, y = read_ints()
    dl[x].add(y)
# print(dl)
cnt = defaultdict(int)
N = (n+1) * n // 2

ans = 1
for x, l in dl.items():
    cnt[N - sum(l)] += 1

for c, k in cnt.items():
    ans = ans * binPow(c, k, MOD) % MOD

print(ans * binPow(N, m-len(dl), MOD) % MOD)

Python3 解法, 执行用时: 316ms, 内存消耗: 30660K, 提交时间: 2022-04-22 15:57:51

import sys
from collections import defaultdict

def read_ints():
    return map(int, sys.stdin.readline().split())

def binPow(a, n, m):
    res = 1
    while n:
        if n & 1:
            res = res * a % m
        a = a * a % m
        n >>= 1
    return res

MOD = 10 ** 9 + 7
n, m, k = read_ints()

dl = defaultdict(set)

for i in range(k):
    x, y = read_ints()
    dl[x].add(y)
# print(dl)
cnt = defaultdict(int)
N = (n+1) * n // 2

ans = 1
for x, l in dl.items():
    ans = ans * (N - sum(l)) % MOD

print(ans * binPow(N, m-len(dl), MOD) % MOD)

C++(clang++ 11.0.1) 解法, 执行用时: 171ms, 内存消耗: 11908K, 提交时间: 2022-10-17 10:32:33

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll mod=1e9+7;
map<int,set<int>>mp;
ll qsm(ll a,ll b)
{
	a%=mod;
	ll res=1;
	while(b)
	{
		if(b&1)
		res=res*a%mod;
		a=a*a%mod;
		b/=2;
	}
	return res;
}
int  main()
{
	ll n,m,k,sum,ans;
	cin>>n>>m>>k;
	sum=n*(n+1)/2;
	for(int i=0;i<k;i++)
	{
		ll a,b;
		cin>>a>>b;
		mp[a].insert(b);
	}
	ans=qsm(sum,m-mp.size());
	for(auto x:mp)
	{
		ll t=sum;
		for(auto y:x.second)
		t-=y;
		ans=t%mod*ans%mod;
	}
	cout<<ans;
}

上一题