[HAOI2012] 容易题
有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值,我们定义一个数列的积为该数列所有元素的乘积,要求你求出所有可能的数列的积的和 mod 1000000007的值;
--by洛谷;
http://daniu.luogu.org/problem/show?pid=2220
简单题?呵呵
首先,她有个公式
我们先假设k=0;
ai为a位的可能;bi为b位的可能;ci为c位的可能...
则:
a1*b1*c1+a1*b1*c2+a1*b2*c1+a1*b2*c2+a2*b1*c1+a2*b1*c2+a2*b2*c1+a2*b2*c2;
你提公因式嘛;
a1*(b1*c1+b1*c2+b2*c1+b2*c2)+a2*(b1*c1+b1*c2+b2*c1+b2*c2);
再提
a1*[b1*(c1+c2)+b2*(c1+c2)]+a2*[b1*(c1+c2)+b2*(c1+c2)];
a1*(b1+b2)*(c1+c2)+a2*(b1+b2)*(c1+c2);
(a1+a2)*(b1+b2)*(c1+c2);
再通过k的存在,对每位的可能减zi;
(a1+a2-z1)*(b1+b2-z2)*(c1+c2-z3);
然后每一位在k=0一样,即a1+a2=b1+b2=c1+c2=sum(n);
(sum(n)-z1)*(sum(n)-z2)*(sum(n)-z3);
所以,这叫简单题?
就想预处理sum(n)然后O(n)乘,每次记得减z;
然而O(n)也过不了——n=1e9。。。
所以,这叫简单题?
但是我们发现,k比较小,1e5;
所以有限制的位置,小于等于1e5;
我们可以先算她们,然后剩下的写一个快速幂;
时间效率O(klogk+k+log(n-k));
(因为有个sort);
代码如下:
#include<cstdio>
#include<algorithm>
#define mod 1000000007
using namespace std;
struct ss
{
int x,y;
}a[];
long long b[]; bool cmp(ss a,ss b)
{
if(a.x==b.x)
return a.y<b.y;
return a.x<b.x;
}
long long sqr(long long ,int ); int main()
{
int n,m,k;
long long sz1=;
long long ans=;
int i,j,l;
scanf("%d%d%d",&n,&m,&k);
sz1=(long long)n*(n+)/%mod;
for(i=;i<=k;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+,a+k+,cmp);
j=;
for(i=;i<=k;i++)
{
if(a[i].x!=a[i-].x)
b[++j]=a[i].y;
else
if(a[i].y!=a[i-].y)
b[j]=(b[j]+a[i].y)%mod;
}
for(i=;i<=j;i++)
ans=(ans*(sz1-b[i]+mod))%mod;
m=m-j;
ans=(ans*sqr(sz1,m))%mod;
printf("%lld",ans);
return ;
} long long sqr(long long sz,int m)
{
long long ans=;
while(m)
{
if(m&)
ans=(ans*sz)%mod;
sz=(sz*sz)%mod;
m=m>>;
}
return ans;
}
祝AC哟;
[HAOI2012] 容易题的更多相关文章
- BZOJ 2751: [HAOI2012]容易题(easy) 数学
2751: [HAOI2012]容易题(easy) 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2751 Description 为了使 ...
- 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), 用快速幂. ------------------------------------------- ...
- 2751: [HAOI2012]容易题(easy)
2751: [HAOI2012]容易题(easy) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1087 Solved: 477[Submit][ ...
- [HAOI2012] 容易题[母函数]
794. [HAOI2012] 容易题 ★★☆ 输入文件:easy.in 输出文件:easy.out 简单对比时间限制:1 s 内存限制:128 MB 秒 输入:easy.in 输出: ...
- 【bzoj2751】[HAOI2012]容易题(easy) 数论-快速幂
[bzoj2751][HAOI2012]容易题(easy) 先考虑k=0的情况 那么第一个元素可能为[1,n] 如果序列长度为m-1时的答案是ans[m-1] 那么合并得 然后同理答案就是 k很小 而 ...
- 洛谷 P2220 [HAOI2012]容易题 数论
洛谷 P2220 [HAOI2012]容易题 题目描述 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数 ...
- BZOJ2751 [HAOI2012]容易题
Description 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取 ...
- 2018.11.07 bzoj2751: [HAOI2012]容易题(easy)(组合数学)
传送门 组合数学一眼题. 感觉一直做这种题智商会降低. 利用组合数学的分步计数原理. 只用关心每个数不被限制的取值的总和然后乘起来就可以了. 对于大部分数都不会被限制,总和都是n(n+1)2\frac ...
随机推荐
- 计算S(n)=a+aa+aaa+...... 其中a是一个数字
描述 计算S(n)=a+aa+aaa+...... 其中a是一个数字 输入数据 两个分别表示a和n的整数 输出数据 一个表示S(n)的整数 输入示例 3 5 输出示例 37035 # include ...
- Android 绘制计时器
用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用.于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点. Android中绘制采用ca ...
- 关于Windows环境下安装Android模拟器Genymotion的教程
打开Genymotion的官网www.genymotion.com,点击按钮"get genymotion", 选择"Free"下的"DOWNLOAD ...
- 数组方法slice()把类数组转成数组和复制一个数组
function a(){ console.log(arguments.length); var c = [].slice.call(arguments);//类数组转成数组 c.push(5); c ...
- Firefly官方教程之DBentrust使用文档
原地址: http://bbs.gameres.com/thread_224185.html 1.dbentrust说明该模块主要是对数据库与memcached存储的处理.里面封装了从memcache ...
- Wp8开发环境搭建总结
原地址:http://blog.csdn.net/lixing732100721/article/details/8564985 注意:技术发展太快 此文章年代已久 请大家酌情参照 系统要求(来自 ...
- 李洪强漫谈iOS开发[C语言-022]-算术运算符
- velocity-1.7中vm文件的存放位置
velocity-1.7中关于vm文件存放 demo: public class App_example1 { public App_example1() { String propfile=&quo ...
- 【Python】代码行数统计
两级目录,可扩展为N级. # Count the line of dir or file import os, fnmatch, fileinput def ChkFileType(lst): tmp ...
- 海量数据的二度人脉挖掘算法(Hadoop 实现)
最近做了一个项目,要求找出二度人脉的一些关系,就好似新浪微博的“你可能感兴趣的人” 中,间接关注推荐:简单描述:即你关注的人中有N个人同时都关注了 XXX . 在程序的实现上,其实我们要找的是:若 U ...