P2220 [HAOI2012]容易题[小学数学]
题目描述
为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下:
有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值,是不是很简单呢?呵呵!
解析
标签里面数论是骗人的(雾),难道是因为有个取模吗???
这题还是很简单的,首先观察数据范围,发现k比较小,那我们就对它做文章。
我们不妨先求出没有限制条件下的总和,再减去限制条件造成的影响,这样复杂度就与k有关了。
假设\(p\)为除了位置\(i\)其余位置的积,那么
\(ans=1*p+2*p+\cdots+n*p=(\frac{n(n+1)}{2})*p\)
对于任意位置,显然都是这个东西。
那么\(ans={(\frac{n(n+1)}{2})}^m\)。
或者理解作一堆项相乘,\(ans=(1+2+\cdots+n)*(1+2+\cdots+n)*\cdots\)
总共有\(m\)项,就变成上面那个东西。
然后我们考虑限制条件。
先对限制按位置排序,对于一个位置\(i\)的所有限制条件,若它们的和为\(sum\),很容易看出它们剔除的答案为\(sum*{(\frac{n(n+1)}{2})}^{m-i-1}*now\)。其中\(now\)为剔除过限制条件的\(1\sim i-1\)的积。\(now\)的初始值是1,每次剔除都乘上\(\frac{n(n+1)}{2}-sum\)。
而且,由于每次剔除的位置对最后结果无影响,离散化。
复杂度\(O(klogm+klogk)\)。
我的代码写的比较鬼畜,还请各位大佬见谅QWQ。
参考代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#include<set>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100010
#define MOD 2520
#define E 1e-12
#define ll long long
#define mod 1000000007
#define div 500000004
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
ll n,m,k,sum[N];
set<int> s[N];
struct node{
int pos,x;
inline bool operator<(const node &a)const{
return a.pos>pos;
}
}a[N];
inline ll qp(ll a,ll b){ll ans=1;for(;b;b>>=1){if(b&1)ans=(ans*a)%mod;a=(a*a)%mod;}return ans%mod;}
int main()
{
n=read(),m=read(),k=read();
for(int i=1;i<=k;++i)
a[i].pos=read(),a[i].x=read();
sort(a+1,a+k+1);
int cnt=1,pos=a[1].pos;
for(int i=1;i<=k;++i){
if(pos==a[i].pos){
if(s[cnt].find(a[i].x)!=s[cnt].end()) continue;
s[cnt].insert(a[i].x),sum[cnt]=(sum[cnt]%mod+a[i].x%mod)%mod;
}
else s[++cnt].insert(a[i].x),sum[cnt]=(sum[cnt]%mod+a[i].x%mod)%mod;
pos=a[i].pos;
}//脑抽写的set离散化
ll tmp=(n%mod*(n+1)%mod*div%mod)%mod;
ll ans=qp(tmp,m)%mod;
ll now=1;
for(int i=1;i<=cnt;++i){
ans=(ans%mod-sum[i]%mod*qp(tmp,m-i)%mod*now%mod+2*mod)%mod;
now=(now%mod*(tmp%mod-sum[i]%mod+2*mod)%mod)%mod;
}
printf("%lld\n",ans%mod);
return 0;
}
P2220 [HAOI2012]容易题[小学数学]的更多相关文章
- 洛谷 P2220 [HAOI2012]容易题 数论
洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...
- BZOJ 2751: [HAOI2012]容易题(easy) 数学
2751: [HAOI2012]容易题(easy) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2751 Description 为了使 ...
- P2220 [HAOI2012]容易题(快速幂)
Describe 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值 ...
- P2220 [HAOI2012]容易题【快速幂】
题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定 ...
- P2220 [HAOI2012]容易题
传送门 首先 $(\sum_{i=1}^{n}a_i)(\sum_{i=1}^{m}b_i)$ 展开以后包含了所有 $ab$ 两两相乘的情况并且每种组合只出现一次 发现展开后刚好和题目对序列价值的定义 ...
- sdut 2445 小学数学
小学数学 Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...
- 【BZOJ4429】[Nwerc2015] Elementary Math小学数学 最大流
[BZOJ4429][Nwerc2015] Elementary Math小学数学 Description Ellen给她的学生教小学数学.期末考试已经来临了.考试有n个题目,每一个题目学生们都要对一 ...
- BZOJ2751: [HAOI2012]容易题(easy)
2751: [HAOI2012]容易题(easy) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 872 Solved: 377[Submit][S ...
- BZOJ 2751: [HAOI2012]容易题(easy)( )
有限制的最多就K个, 所以我们处理一下这K个就行了. 其他可以任选, 贡献都是∑i (1≤i≤N), 用快速幂. ------------------------------------------- ...
随机推荐
- 免费https证书
https://certbot.eff.org/lets-encrypt/ubuntuother-nginx https://ruby-china.org/topics/31942 https://l ...
- CentOS环境设置Hbase自启动
1.在/etc/init.d/目录创建hbase文件 #!/bin/bash # chkconfig: #export JAVA_HOME=/usr/local/jdk1.8.0_191 HBASE_ ...
- Scopus数据库简介
ScienceDirect数据库1. Elsevier简介荷兰Elsevier 是全球最大的科学文献出版发行商,已有180多年的历史.其产品涵盖科学.技术和医学等各个领域,包括1800多种学术期刊(大 ...
- 【C/C++开发】容器set和multiset,C++11对vector成员函数的扩展(cbegin()、cend()、crbegin()、crend()、emplace()、data())
一.set和multiset基础 set和multiset会根据特定的排序准则,自动将元素进行排序.不同的是后者允许元素重复而前者不允许. 需要包含头文件: #include <set> ...
- centos 安装mysql8.0.16
清除自带的mariadb > rpm -qa|grep mariadb mariadb-libs-5.5.44-2.el7.centos.x86_64 > rpm -e --nodeps ...
- Scrum story
鸡和猪的故事故事: 一天,一只鸡散步时遇见了猪. 鸡对猪说:“嗨,我们合伙开个餐厅吧.” 猪说:“好啊,那准备取什么店名呢?” 鸡说:“要不,就叫火腿和鸡蛋吧.” 猪直接拒绝了:“那可不行.我要割肉, ...
- HUT 排序训练赛 G - Clock
Clock Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u [Submit] [Go ...
- 公众号后台开发(SpingMVC接收与响应公众号消息)
1.准备 1.准备服务 与微信对接的url要具备以下条件: (1)在公网上能够访问 (2)端口只支持80端口 在这里如果是公网能够访问的服务最好,也可以通过花生壳或者其他外网映射工具进行映射,比如ng ...
- Delphi BusinessSkinForm使用说明
1.先放bsBusinessSkinForm.bsSkinData.bsStoredSkin各一个到窗体上 2.修改bsBusinessSkinForm的SkinData属性为bsSkinData1 ...
- BAPI_TRANSACTION_COMMIT
通过NCO执行SAP里面的 BAPI_TRANSACTION_COMMIT 并不能直接生效,类似SQL 里面的事物一样,需要有开始与结束,正确的方式如下: RfcSessionManager.Begi ...