【做题】hdu5514 Frogs——另类容斥
题意是给出n个m的约数,问[0,m-1]中至少被其中一个约数整除的整数和。(n<=10000,m<=1000000000)
直接容斥的话,是2^n再拖个log的复杂度,加上当前的数大于m时直接跳出了剪枝,或许会小一点。
但是有一个很重要的性质:我们容斥中所有计算过贡献的数,都是m的因数。换言之,我们计算贡献的数的个数是及其有限的,故可以计算出所有因数贡献的系数。
我们给所有因数赋予互不重叠的“贡献”,定义为所有能被其整除但不能被其他大于它的因数整除的数的和。这种贡献是我们用来表示答案的组成的,但是不可以直接计算。
于是一开始,我们把所有是这n个约数的倍数的贡献设为1。事实上,容斥就体现在这里。我们这里是设为1,而不是加1。即对于一个同时是多个因数的倍数的数,我们只计算一次贡献。
然而,我们在实际计算中,一个数的贡献在它的所有因数中都计算过了。设因数i的实际系数是ri,初始定义的系数是vi,那么,我们有

时间复杂度O(√m+n*d(m)+d(m)^2)。(好像非常玄学)
#include <bits/stdc++.h>
using namespace std;
const int N = ;
typedef long long ll;
ll ans;
int a[N],n,m,p,fac[N],num[N],cnt,tmp;
int main() {
int t;
scanf("%d",&t);
for (int ca = ; ca <= t ; ++ ca) {
memset(num,,sizeof num);
scanf("%d%d",&n,&m);
cnt = ;
ans = ;
for (int i = ; i * i <= m ; ++ i) if (m%i == ) {
fac[++ cnt] = i;
if (i * i != m) fac[++ cnt] = m/i;
}
sort(fac+,fac+cnt+);
for (int i = ; i <= n ; ++ i) {
scanf("%d",&a[i]);
a[i] = __gcd(a[i],m);
for (int j = ; j <= cnt ; ++ j)
if (fac[j] % a[i] == ) num[j] = ;
}
for (int i = ; i <= cnt ; ++ i) if (num[i]) {
tmp = m / fac[i];
ans += 1ll * tmp * (tmp - ) / * fac[i] * num[i];
for (int j = i + ; j <= cnt ; ++ j)
if (fac[j] % fac[i] == ) num[j] -= num[i];
}
printf("Case #%d: %lld\n",ca,ans);
}
return ;
}
小结:在容斥对象数量少的时候,存下其中的每一个贡献的系数是可取的优化方向。
【做题】hdu5514 Frogs——另类容斥的更多相关文章
- 2018 湖南网络比赛题 HDU - 6286 (容斥)
题意:不说了. 更加偏向于数学不好的小可爱来理解的. 这篇博客更加偏重于容斥的讲解.用最直观的数学方法介绍这个题. 思路: 在a<=x<=b. c<=y<=d 中满足 x*y ...
- 【BZOJ4927】第一题 双指针+DP(容斥?)
[BZOJ4927]第一题 Description 给定n根直的木棍,要从中选出6根木棍,满足:能用这6根木棍拼 出一个正方形.注意木棍不能弯折.问方案数. 正方形:四条边都相等.四个角都是直角的四边 ...
- SPOJ - AMR11H Array Diversity (水题排列组合或容斥)
题意:给定一个序列,让你求两种数,一个是求一个子序列,包含最大值和最小值,再就是求一个子集包含最大值和最小值. 析:求子序列,从前往记录一下最大值和最小值的位置,然后从前往后扫一遍,每个位置求一下数目 ...
- HDU 5514 Frogs (数论容斥)
题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 析:首先可以知道的是第 i 只青蛙可以跳到 k * gcd(ai, m),然后我就计 ...
- JZOJ 5987 仙人掌毒题 (树链剖分 + 容斥)
跟仙人掌其实没啥关系- Here 注意 每一次都O(n)O(n)O(n)一下算某些点都是黑点的概率其实并不是O(n2)O(n^2)O(n2),因为每个环只用算一次. #include <ccty ...
- [CTS2019]随机立方体(容斥+组合数学)
这题七次方做法显然,但由于我太菜了,想了一会发现也就只会这么多,而且别的毫无头绪.发现直接做不行,那么,容斥! f[i]为至少i个极值的方案,然后这里需要一些辅助变量,a[i]表示选出i个三维坐标均不 ...
- 2019.02.11 bzoj4767: 两双手(组合数学+容斥dp)
传送门 题意简述:你要从(0,0)(0,0)(0,0)走到(ex,ey)(ex,ey)(ex,ey),每次可以从(x,y)(x,y)(x,y)走到(x+ax,y+ay)(x+ax,y+ay)(x+ax ...
- 【hdu4135】【hdu2841】【hdu1695】一类通过容斥定理求区间互质的方法
[HDU4135]Co-prime 题意 给出三个整数N,A,B.问在区间[A,B]内,与N互质的数的个数.其中N<=10^9,A,B<=10^15. 分析 容斥定理的模板题.可以通过容斥 ...
- ARC 093 F Dark Horse 容斥 状压dp 组合计数
LINK:Dark Horse 首先考虑1所在位置. 假设1所在位置在1号点 对于此时剩下的其他点的方案来说. 把1移到另外一个点 对于刚才的所有方案来说 相对位置不变是另外的方案. 可以得到 1在任 ...
随机推荐
- 《大话设计模式》c++实现 装饰者模式
一.UML图 介绍 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创 ...
- NFS配置与安装
安装 1 环境描述: * 网络环境: NFS server: 192.168.102.47 NFS client: 192.1 ...
- django user 权限
Django中的Users权限系统 2011-05-21 15:04:33 分类: Python/Ruby 权限系统包含1.用户2.权限(判断一个用户是否有特定的操作权限yes/no)3.组4.消息 ...
- latex 公式 和排版
http://bbs.chinatex.org/forum.php?mod=viewthread&tid=7423 http://blog.sina.com.cn/s/blog_5e16f17 ...
- CSS文本(Text)属性-----letter-spacing和text-align
letter-spacing letter-spacing:normal | <length> 指定字符之间的额外间隙 normal:默认间隔.计算值为0 <length&g ...
- linux常用命令:ls命令
ls命令是linux下最常用的命令.ls命令就是list的缩写,缺省下ls用来打印出当前目录的清单,如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linux ...
- ClassThree__HomeWork
作业一 使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?”. 代码 public class TestOne { ...
- xshell中出现的绿色背景的文件夹
这种文件夹表示权限为777的文件夹 可以使用chmod 777 fileName进行权限修改 如果需要将文件夹以及其子文件夹的权限全部置为777 chmod 777 -R directoryName/ ...
- [转载]Oracle修改用户表所属表空间的步骤
1 .修改表的空间alter table TABLE_NAME move tablespace TABLESPACENAME 查询当前用户下的所有表选择'alter table'|| table_na ...
- 如何用nginx在本地把9000端口转发到80端口上
起因看到一个用java写的轻博客,于是就兴致冲冲的试用一下.由于是lnmp的环境,Nginx占用了80端口,新博客只能用其他的端口,这里选择了9000端口,本地测试没问题.总不能访问了域名然后在加上端 ...