题目大意

洛谷链接

有一个数列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

思路

从一般到特殊,如果没有不能选的限制,因为每个元素可以把范围内每个数取到,可以得到结果是:

\(( \sum_{1\le k\le n}k)^m\)

然而题目中提到有些元素的有些取值取不到,那么对应的元素的总价值把这些取值都减去再乘进去就可以了。剩下的没有动的元素直接累乘,注意要用到快速幂。

代码

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int maxn=100000+5;
  5. const long long mod=1e9+7;
  6. map<pair<ll,ll>,ll> a;//学lc大佬用的pair...其实用结构体也可
  7. map<ll,ll> b;
  8. ll n,m,k,cnt;
  9. ll vis[maxn];
  10. ll qpow(ll now,ll x){//快速幂的板子
  11. ll vis=now%mod,res=1;
  12. while(x){
  13. if(x&1){
  14. res*=(vis%mod);
  15. res%=mod;
  16. }
  17. vis*=(vis%mod);
  18. vis%=mod;
  19. x>>=1;
  20. }
  21. return res;
  22. }
  23. int main(){
  24. scanf("%lld%lld%lld",&n,&m,&k);
  25. ll sum=(n+1)*n/2;
  26. for(ll i=1;i<=k;i++){
  27. ll x,y;
  28. scanf("%lld%lld",&x,&y);
  29. if(!b[x])vis[++cnt]=x;
  30. if(a[make_pair(x,y)])continue;//样例给出了重复限制,所以记一下
  31. a[make_pair(x,y)]=1;
  32. b[x]+=y;//记录限制的总和
  33. }
  34. ll ans=1;
  35. for(ll i=1;i<=cnt;i++){
  36. ans*=(sum-b[vis[i]])%mod;
  37. ans%=mod;
  38. }
  39. printf("%lld\n",((ans%mod)*qpow(sum,m-cnt)%mod)%mod);
  40. return 0;
  41. }

【数论】HAOI2012 容易题的更多相关文章

  1. 【bzoj2751】[HAOI2012]容易题(easy) 数论-快速幂

    [bzoj2751][HAOI2012]容易题(easy) 先考虑k=0的情况 那么第一个元素可能为[1,n] 如果序列长度为m-1时的答案是ans[m-1] 那么合并得 然后同理答案就是 k很小 而 ...

  2. 洛谷 P2220 [HAOI2012]容易题 数论

    洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...

  3. BZOJ 2751: [HAOI2012]容易题(easy) 数学

    2751: [HAOI2012]容易题(easy) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2751 Description 为了使 ...

  4. BZOJ2751: [HAOI2012]容易题(easy)

    2751: [HAOI2012]容易题(easy) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 872  Solved: 377[Submit][S ...

  5. BZOJ 2751: [HAOI2012]容易题(easy)( )

    有限制的最多就K个, 所以我们处理一下这K个就行了. 其他可以任选, 贡献都是∑i (1≤i≤N), 用快速幂. ------------------------------------------- ...

  6. 2751: [HAOI2012]容易题(easy)

    2751: [HAOI2012]容易题(easy) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1087  Solved: 477[Submit][ ...

  7. [HAOI2012] 容易题[母函数]

    794. [HAOI2012] 容易题 ★★☆   输入文件:easy.in   输出文件:easy.out   简单对比时间限制:1 s   内存限制:128 MB 秒 输入:easy.in 输出: ...

  8. 【bzoj2751】[HAOI2012]容易题(easy) 数论,简单题

    Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪 ...

  9. P2220 [HAOI2012]容易题[小学数学]

    题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定 ...

随机推荐

  1. 一些免费的API

    Github 接口 Github 为我们提供了一些免费的 API 接口,利用这些接口我们可以开发一些工具. 接口文档地址为 https://docs.github.com/en/rest 下面是一个例 ...

  2. (.net core环境下)图形验证,人机交互,一个不够我给你两个

    做软件,遇到一些通用性的功能,我想绝大多数同学都是去网上(或自己之前的项目中)搜一段代码出来,贴到项目中,修修改改,完成任务. 但身为一个有追求的软件工程师,怎么能一直忍受这种低级的操作呢?插件化,模 ...

  3. oracle之三手工备份与恢复

    手工备份与恢复 2.1 手工备份和恢复的命令 1)备份和还原都使用OS命令,如linux中的cp 2)恢复用sqlplus命令:recover 2.2 备份前要对数据库进行检查: 1) 检查需要备份的 ...

  4. PHP程序十点未来的建议

    1. Composer 第一点就要提 Composer ,自从 Composer 出现后,PHP 的依赖管理可以变得非常简单.程序内依赖一些类库和框架,直接使用 Composer 引入即可,通过使用 ...

  5. python获取倒数第k个结点

    思路:定义快慢两个指针,快指针走k步后慢指针开始走,当快指针走到链表尾时快慢指针距离相隔k,倒数第K个结点就是慢指针所指的结点 # -*- coding:utf-8 -*- # class ListN ...

  6. 重磅来袭 Vue 3.0 One Piece 正式发布

    代号为One Piece 的Vue3.0 在9月19日凌晨正式发布!! 此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小,和更好的 TypeScript 支持. ...

  7. python文档翻译之使用python解释器

    Python解释器通常安装在/usr/local/bin/python3.6,把/usr/local/bin目录设置到UNIX shell的搜索路径就可以使用下面的命令运行python: python ...

  8. Django ContentType(ORM操作)

    ContentType-设计课程表 # 数据: """ 免费课:Python入门 学位课:Python全栈 价格策略: Linux入门 7 0 Python入门 7 0 ...

  9. Java随谈(三)如何创建好一个对象?

    本文推荐阅读时间30分钟 大家都知道,在编写Java程序里,一般就是处理各种各样的对象,那么,你知道一共有多少种创建对象的方式吗? 希望大家能稍微思考一下再往下翻. 答案是4种 new 一个对象 反射 ...

  10. 微信App支付接入步骤&支付中前后端交互流程

    最近对微信App支付(App端集成微信支付SDK)申请步骤,以及终端在进行微信支付时商户App.商户Server.微信App.微信支付Server的交互流程进行了简单了解.这篇文章应该算是学习笔记,分 ...