题目描述

为了使得大家高兴,小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]容易题[小学数学]的更多相关文章

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

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

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

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

  3. P2220 [HAOI2012]容易题(快速幂)

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

  4. P2220 [HAOI2012]容易题【快速幂】

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

  5. P2220 [HAOI2012]容易题

    传送门 首先 $(\sum_{i=1}^{n}a_i)(\sum_{i=1}^{m}b_i)$ 展开以后包含了所有 $ab$ 两两相乘的情况并且每种组合只出现一次 发现展开后刚好和题目对序列价值的定义 ...

  6. sdut 2445 小学数学

    小学数学 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 题目链接:http://acm.sdut.edu.cn/sdutoj/p ...

  7. 【BZOJ4429】[Nwerc2015] Elementary Math小学数学 最大流

    [BZOJ4429][Nwerc2015] Elementary Math小学数学 Description Ellen给她的学生教小学数学.期末考试已经来临了.考试有n个题目,每一个题目学生们都要对一 ...

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

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

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

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

随机推荐

  1. gunicorn 参数

    gunicorn -w 4 -b 0.0.0.0:8080 yourpyfilename:app --log-level DEBUG --timeout 60gunicorn的命令对应参数含义如下: ...

  2. JS 中判断数据类型是否为 null、undefined 或 NaN

    判断 undefined var aaa = undefined; console.log(typeof(aaa) === "undefined"); // true 判断 nul ...

  3. python 字典转成对象

    database = { "key1": { 'period':999, "data": { 'a':1, 'b':2, } }, "key2&quo ...

  4. ArcGIS Server浏览地图服务无响应原因分析说明

    1.问题描述 从4月17号下午5时起,至18号晚9点,客户单位部分通过ArcGIS Server发布的地图服务(该部分地图服务的数据源为数据库SJZX)无法加载浏览,表现为长时间无响应.同时,通过Ar ...

  5. 027 ElasticSearch----全文检索技术02---快速入门

    1.基本概念 Elasticsearch也是基于Lucene的全文检索库,本质也是存储数据,很多概念与MySQL类似的. 注意:6.0之前的版本有type(类型)概念,type相当于关系数据库的表,E ...

  6. python的JSON库

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写. 1.json库的使用 使用 JSON 函数需要导入 json 库:import jso ...

  7. C# vb .net图像合成-合成矩形

    在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...

  8. ProviderManager

    类ProviderManager java.lang.Object继承 org.jivesoftware.smack.provider.ProviderManager public final cla ...

  9. Appium中app的元素定位

    app定位方式,本文只讲Android手机的定位方式. 前提条件是adb连接到模拟器或者是手机(具体连接方式这里不再讲解),证明已连接到设备 adb devices app元素定位工具一:UI Aut ...

  10. 详细的Hadoop的入门教程-伪分布模式Pseudo-Distributed Operation

    一. 伪分布模式Pseudo-Distributed Operation 这里关于VM虚拟机的安装就不再介绍了,详细请看<VMware虚拟机的三种网络管理模式>一章介绍.这章只介绍hado ...