[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 ...
随机推荐
- Android 绘制计时器
用小米的手机,发现其实还可以,无意间点开小米的计时器,发现界面非常好看和实用.于是自己仿照着写一个,由于技术不好,代码整体结构上可能有点乱,但主要的实现功能和掌握知识点. Android中绘制采用ca ...
- Oracle数据库安装完成之后的启动操作
由于是菜鸟,在 完成Oracle数据库的安装之后,不知道该怎么启动.在经过一番折腾之后明白了其中的一些道理,总结如下: 其实Oracle数据库和Mysql数据库的启动都是相同的原理. Mysql数据库 ...
- IBM
http://www.ibm.com/developerworks/cn/data/library/techarticle/dm-1306mongodb2/
- php的curl获取https加密协议请求返回json数据进行信息获取
<?php header("Content-type:text/html; charset=utf-8");function getToken($url){ $ ...
- POJ 3349 Snowflake Snow Snowflakes(哈希)
http://poj.org/problem?id=3349 题意 :分别给你n片雪花的六个角的长度,让你比较一下这n个雪花有没有相同的. 思路:一开始以为把每一个雪花的六个角的长度sort一下,然后 ...
- Hausdorff距离
Hausdorff距离是描述两组点集之间相似程度的一种量度,它是两个点集之间距离的一种定义形式:假设有两组集合A={a1,…,ap},B={b1,…,bq},则这两个点集合之间的Hausdorff距离 ...
- [HDU 4433]locker[DP]
题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...
- Android 内核初识(4)属性服务器
简介 Windows平台上有一个叫注册表的东西.注册表可以存储一些类似key/value的键值对.一般而言,系统或某些应用程序会把自己的一些属性存储在注册表中,即使下次系统重启或应用程序重启,它还能够 ...
- scp传入固件,sysupgrade xx.bin升级固件
scp传入固件,sysupgrade xx.bin升级固件
- Colored Sticks (字典树哈希+并查集+欧拉路)
Time Limit: 5000MS Memory Limit: 128000K Total Submissions: 27704 Accepted: 7336 Description You ...