bzoj2751--[HAOI]2012容易题--组合(乘法原理)

Description

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

Input

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

Output

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

Sample Input

3 4 5

1 1

1 1

2 2

2 3

4 3

Sample Output

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

HINT

数据范围

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

题解:

  首先假设如果k=0。

  容易发现没有限制时,a[i]的每个位置都可以取1~n的任何一个数字,而因为a数组只有m个位置,所以显然此时

  那如果k!=0,就代表a[i]的当前位置有限制数字时,它只能取1~n中限制数字以外的。

  所以计算积时,a[i]贡献给ans的只有这么多。

  于是我们先算出不被限制的位置的乘积,也就是  其中cnt表示总共有多少位置被限制了(cnt不一定等于k)

  对于被限制的位置,我们判一下重,一个位置可能被多个数字限制。

  最后被限制的和不被限制的相乘即为所求。

 1 #include<iostream>
 2 #include<cmath>
 3 #include<cstdio>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 const int mod=1000000007;
 8 const int maxn=100009;
 9 ll sum[maxn];
10 struct data
11 {
12     ll x,y;
13 }a[maxn];
14 bool cmp(data a1,data a2)
15 {
16     if(a1.x==a2.x)
17         return a1.y<a2.y;
18     else
19         return a1.x<a2.x;
20 }
21 int poww(int x,int y,int mod)
22 {
23     int ret=1;
24     while(y)
25     {
26         if(y&1)
27             ret=1ll*ret*x%mod;
28         x=1ll*x*x%mod;
29         y>>=1;
30     }
31     return ret;
32 }
33 int main()
34 {
35     ll ans=0;
36     int n,m,k;
37     cin>>n>>m>>k;
38     ll sgm=(1ll*n*(n+1)>>1)%mod;
39     for(int i=1;i<=k;i++)
40     {
41         cin>>a[i].x>>a[i].y;
42     }
43     sort(a+1,a+k+1,cmp);
44     int cnt=0;
45     for(int i=1;i<=k;i++)
46     {
47         if(a[i].x!=a[i-1].x)
48             sum[++cnt]=sgm;//判重
49         else
50         {
51             if(a[i].y==a[i-1].y)//防止多次减同一个限制条件
52             continue;
53         }
54         sum[cnt]=(sum[cnt]-a[i].y+mod)%mod;//减去被限制的数
55     }
56     ans+=poww(sgm,m-cnt,mod);
57     for(int i=1;i<=cnt;i++)
58     {
59         ans=(ans*sum[i]+mod)%mod;//乘上有限制的情况
60     }
61     cout<<ans<<endl;
62     return 0;
63 }

时间: 2024-10-06 11:31:17

bzoj2751--[HAOI]2012容易题--组合(乘法原理)的相关文章

BZOJ 2751 HAOI 2012 容易题(easy) 数学

题目大意:给出一个序列中哪个位置不能出现哪一种数字,求可以组成的数列的积的和. 思路:如果我们让第一个位置确定,那么这个问题就可以转化成一个子问题.也就是第一位的数字乘上后面的积的和.推下去的话不难发现,其实求得就是每一位和的积.观察一下mn都很大,之后k不大,于是就用个map啥的随便记录一下,然后写个快速幂,再写个快速乘,没了.. CODE: #include <map> #include <cstdio> #include <cstring> #include &l

[2012] 数组题

1.选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2,表示大众评委,n表示评委总数.打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 0.6 + 大众评委 *  0.4,总分取整.如果没有大众评委,则 总分 = 专家评委平均分,总分取整.函数最

[2012] 数组题(2)

给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数.      例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9,

windows server 2012 r2 NIC组合的一些概念

成组模式 1.静态成组: 也叫做交换机依赖组,由于这种NIC组合需要交换机参与到组合中,所以NIC组中的所有适配器都必须连接到相同的交换机上面,不能分散在多个不同的交换机上.需要交换机支持IEEE802.3ad标准. 2.交换机独立: 该NIC组合无需交换机参与到组合中,所以每个适配器可以连接到不同的交换机,也在交换机级别提供了基本的容错. 3.LACP: 链路汇聚控制协议(Link Aggregation Control Protocol,LACP),该组合可以自动将多个NIC组合成一股逻辑(

解题:HAOI 2012 道路

题面 这题不开O2怎么过=.= 可能这种有关最短路的计数题做多了就有些感觉了...... 以每个点为基准跑出一张最短路图,然后对每个边$(u,v)$统计两个东西.一个$pre[u]$表示到达$u$这个起点的路径条数,一个$nxt[v]$表示从$v$开始的最短路数,然后对每条边来一下乘法原理. 然后是这两个玩意的统计方法,$pre[]$可以在最短路图上跑拓扑排序得出,$nxt[]$可以跑记忆化搜索,这样统计的复杂度是$O(n+m)$的,总复杂度大概$O(nmlog$ $n)$?然而并不能卡过去..

NOIp2014模拟赛8 河南省选(HAOI 2012)

地址见 BZOJ  2748~2750 Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低. 音量用一个整数描述.输入文件中给定整数beginLevel,代表吉他刚开始的音量,以及整数maxLevel,代表吉他的最大音量.音量不能小于0也不能大于maxLevel.输入文件中还给定了n个整数c1

[HAOI 2012]音量调节

Description 一个吉他手准备参加一场演出.他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都要改变一次音量.在演出开始之前,他已经做好了一个列表,里面写着在每首歌开始之前他想要改变的音量是多少.每一次改变音量,他可以选择调高也可以调低.音量用一个整数描述.输入文件中给定整数beginLevel,代表吉他刚开始的音量,以及整数maxLevel,代表吉他的最大音量.音量不能小于0也不能大于maxLevel.输入文件中还给定了n个整数c1,c2,c3…..cn,表示在第i首歌开始

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

Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵! Input 第一行三个整数n,m,k分别表示数列元素的取值范围,数列元素个数,以及已知的限制条数.接下来k行,每行两个正整数x,y表示A[x]的值不能是y.

LeetCode 第77题 组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2输出:[ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4],] 思路: 回溯 BFS搜索 关键在于循环边界的控制. eg: n = 4 , k = 2 要求选2个数 1. 目前选了0个数 先从 1~3中选一个数 (不能选第4个数,相当于剪枝,如果第一个数就选4的话,第二个数没法选了) 2. 目前选了1个数 假设第一步在(1,2,3)中选了2,那么