洛谷 P2220 [HAOI2012]容易题

题目描述

为了使得大家高兴,小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

输出 #1

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<=10\(^9\),m<=10\(^9\),k<=10\(^5\),1<=y<=n,1<=x<=m

分析

我们先去考虑没有限制的情况,那么最终的答案就是

\(( 1+2+3+……+n)^{m}=(\frac{n\times(n-1)}{2})^{m}\)

为什么是这样呢?其实我们可以把数列的每一个元素看成一个集合

每一次我们可以从每个集合中任意取出\(n\)个元素

这\(n\)个元素的值分别为\(1 - n\)

根据乘法原理最终的结果就是

\((1+2+3+……+n)\times(1+2+3+……+n)\times……\)

一共要乘\(m\)次

如果还不理解的话,你可以随便举一个例子,按照上面的式子把它展开

但是,题目中有些元素是取不到的

我们可以记录一下每一个元素取不到的值的和\(tot\)

我们只要把该元素贡献的价值改为\(\frac{n\times(n-1)}{2}-tot\)就可以了

因为题目中的限制条件最多只有\(10^{5}\)个

所以我们记录下有限制条件的元素的个数\(cnt\),对其单独处理

对于其余的元素,我们用快速幂的思想求出\((\frac{n\times(n-1)}{2})^{m-cnt}\)

最后再把所有的结果累乘就可以了

要注意两个问题:

1、因为结果很大,能取模的地方就取模

2、要注意判重,样例已经给出重复的情况了

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
const long long mod=1e9+7;
typedef long long ll;
map<pair<ll,ll>,ll> ma1;
map<ll,ll> ma2;
ll jl[maxn];
ll cf(ll now,ll zs){
ll jl=now%mod,ans=1;
while(zs){
if(zs&1) ans*=(jl%mod),ans%=mod;
jl*=(jl%mod),jl%=mod;
zs>>=1;
}
return ans;
}
int main(){
ll n,m,k,js=0;
scanf("%lld%lld%lld",&n,&m,&k);
for(ll i=1;i<=k;i++){
ll aa,bb;
scanf("%lld%lld",&aa,&bb);
if(!ma2[aa]) jl[++js]=aa;
if(ma1[make_pair(aa,bb)]) continue;
ma1[make_pair(aa,bb)]=1;
ma2[aa]+=bb;
}
ll ans=1,cj=(n+1)*n/2;
for(ll i=1;i<=js;i++){
ans*=(cj-ma2[jl[i]])%mod;
ans%=mod;
}
printf("%lld\n",ans%mod*cf(cj,m-js)%mod%mod);
return 0;
}

洛谷 P2220 [HAOI2012]容易题 数论的更多相关文章

  1. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  2. 在洛谷3369 Treap模板题 中发现的Splay详解

    本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...

  3. 洛谷 P4145 上帝造题的七分钟2 / 花神游历各国

    洛谷 这题就是区间开根号,区间求和.我们可以分块做. 我们记布尔数组vis[i]表示第i块中元素是否全部为1. 因为显然当一个块中元素全部为1时,并不需要对它进行根号操作. 我们每个块暴力开根号,因为 ...

  4. 洛谷 P1372 又是毕业季I[数论/神坑规律题]

    题目描述 为了把毕业晚会办得更好,老师想要挑出默契程度最大的k个人参与毕业晚会彩排.可是如何挑呢?老师列出全班同学的号数1,2,……,n,并且相信k个人的默契程度便是他们的最大公约数(这不是迷信哦~) ...

  5. 洛谷P2429 制杖题 [2017年6月计划 数论10]

    P2429 制杖题 题目描述 求不大于 m 的. 质因数集与给定质数集有交集的自然数之和. 输入输出格式 输入格式: 第一行二个整数 n,m. 第二行 n 个整数,表示质数集内的元素 p[i]. 输出 ...

  6. 洛谷P4204 [NOI2006]神奇口袋 数论

    正解:数论 解题报告: 传送门 第一次用\(\LaTeX\)和\(markdown\),,,如果出了什么锅麻烦在评论跟我港句QAQ \(1)x_{i}\)可以直接离散 \(2)y_{i}\)的顺序对结 ...

  7. 洛谷P4358密钥破解 [CQOI2016] 数论

    正解:数论 解题报告: 先,放个传送门QwQ 这题难点可能在理解题意,,, 所以我先放个题意QAQ 大概就是说,给定一个整数N,可以被拆成两个质数的成绩p*q,然后给出了一个数e,求d满足e*d=1( ...

  8. 洛谷P3166 数三角形 [CQOI2014] 数论

    正解:数论 解题报告: 传送门! 很久以前做的题了呢,,,回想方法还想了半天QAQ 然后写这题题解主要是因为看到了好像有很新颖的法子,就想着,学习一下趴,那学都学了不写博客多可惜 首先港下最常规的方法 ...

  9. 洛谷P2312 解方程 [noip2014] 数论

    正解:数论 解题报告: 这儿是,传送门qwq 又是很妙的一道题呢,专门用来对付我这种思维僵化了的傻逼的QAQ 首先看题目的数据范围,发现a<=1010000,很大的一个数据范围了呢,那这题肯定不 ...

随机推荐

  1. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  2. iOS-Code Data的快速体验

    Code Data Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据 ...

  3. Python数据分析软件包介绍

    Python数据分析主要软件包: 1.python -m pip install numpy 2.python -m pip install pandas 3.python -m pip instal ...

  4. 浅谈Unity的脚本执行顺序

    一.添加脚本的顺序 这是一张官方的脚本顺序图 一般,当我们把脚本绑定在游戏对象上时,或者点击绑定好的脚本的reset按钮时,会调用Reset() 当我们初始化一个对象时,会先调用Awake()在调用O ...

  5. Accord.NET重启4.0 开发

    Accord.NET Framework是在AForge.NET基础上封装和进一步开发来的.功能也很强大,因为AForge.NET更注重与一些底层和广度,而Accord.NET Framework更注 ...

  6. Centos7上添加自定义服务文件并开机启动

    Ⅰ-1 写服务文件 [Unit]   ##服务的说明Description:描述服务After:描述服务类别 [Service]   ##服务运行参数的设置Type=forking是后台运行的形式Ex ...

  7. [AGC043-D]Merge Triplets

    题目   点这里看题目. 分析   我们不妨来考虑一下生成的序列有什么性质.   为了方便表示,我们将序列\(S\)的第\(i\)项写为\(S[i]\).   首先考虑如果所有的\(A\)序列都是递增 ...

  8. Python删除一个列表元素的方法

    参考资料: https://www.cnblogs.com/xiaodai0/p/10564956.html https://www.cnblogs.com/huangbiquan/articles/ ...

  9. 论logstash的玩法(ELK)

    本篇文章采用的采用的是logstash-7.7.0版本,主要从如下几个方面介绍 1.logstash是什么,可以用来干啥 2.logstash的基本原理是什么 3.怎么去玩这个elk的组件logsta ...

  10. 【JMeter_19】JMeter逻辑控制器__简单控制器<Simple Controller>

    简单控制器<Simple Controller> 业务逻辑: 就像他的名字一样,简单,可以理解为一个文件夹,就是分组用的,没有其他特殊功能,但相比不添加简单控制器,区别在于简单控制器可以被 ...