794. [HAOI2012] 容易题

★★☆   输入文件:easy.in   输出文件:easy.out   简单对比
时间限制:1 s   内存限制:128 MB

第一题:容易题(easy)

时间限制:1秒

输入:easy.in

输出:easy.out

问题描述

为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:

有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵!

输入

第一行三个整数n,m,k分别表示数列元素的取值范围,数列元素个数,以及已知的限制条数。

接下来k行,每行两个正整数x,y表示A[x]的值不能是y。

输出

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

样例输入

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

数据范围

30%的数据n<=4,m<=10,k<=10

另有20%的数据k=0

70%的数据n<=1000,m<=1000,k<=1000

100%的数据 n<=109,m<=109,k<=105,1<=y<=n,1<=x<=m

显示代码纯文本

  1. /*
  2. 题解抄的别人的。表示对母函数一脸懵逼。。。
  3. 首先考虑暴力…(20分~~)…然后你会得到一堆式子,从前往后合并同类项,可以发现顺序无所谓,可以先算m-1个的再算m个的。
  4. 然后显然答案就是π(i=1~m)Σ(所有可行的)a[i]
  5. 虽然m很大,但是k只有1e5,所有许多位置可以全选,把没有限制的部分直接一起算就行了
  6. */
  7. #include<cstdio>
  8. #include<iostream>
  9. #include<algorithm>
  10. #define pir pair<int,int>
  11. using namespace std;
  12. typedef long long ll;
  13. const int N=1e5+;
  14. const int mod=1e9+;
  15. int n,m,val,tn,tmp;
  16. pir f[N];
  17. inline int read(){
  18. int x=,f=;char ch=getchar();
  19. while(ch<'0'||ch>'9'){if(ch=='-')f=-;ch=getchar();}
  20. while(ch>='0'&&ch<='9'){x=x*+ch-'0';ch=getchar();}
  21. return x*f;
  22. }
  23. ll fpow(ll a,ll p){
  24. ll res=;
  25. for(;p;p>>=,a=a*a%mod) if(p&) res=res*a%mod;
  26. return res;
  27. }
  28. int main(){
  29. freopen("easy.in","r",stdin);
  30. freopen("easy.out","w",stdout);
  31. val=read();n=read();m=read();
  32. int all=1LL*val*(val+)/%mod;
  33. int ans=;
  34. for(int i=,a,b;i<=m;i++) a=read(),b=read(),f[i]=make_pair(a,b);
  35. sort(f+,f+m+);
  36. m=unique(f+,f+m+)-(f+);
  37. for(int i=;i<=m;i++){
  38. tmp+=f[i].second;
  39. if(i==m||f[i].first!=f[i+].first){
  40. ans=1LL*ans*(all-tmp)%mod;
  41. tmp=;tn++;
  42. }
  43. }
  44. ans=1LL*ans*fpow(all,n-tn)%mod;
  45. if(ans<) ans+=mod;
  46. printf("%d",ans);
  47. return ;
  48. }
05-11 20:36