【做题】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在任 ...
随机推荐
- GameObject.Find与Transform.Find的区别
1.GameObject.Find 函数原型: public static GameObject Find(string name); 说明:1.GameObject只能查找到active的物体 2. ...
- C# 调用.bat 提示该命令不是内部命令或外部命令
前提:双击.bat文件可以执行成功,用C#调用提示该命令不是内部命令或外部命令...... 解决方法:下面代码的红色标注,既要设置.bat文件的文件名FileName,也要设置.bat文件所在的文件夹 ...
- Robotframework 3- 安装
1. 安装, python3 安装好后,在cmd中运行 pip install robotframework # Install the latest version (does not upgrad ...
- django 常用方法总结 < 手写分页-上传头像-redis缓存,排行 ...>
1.不使用自带模块<Paginator>的手写分页功能views.pydef post_list(request): page = request.GET.get('page', 1) # ...
- android本地数据库,微信数据库WCDB for Android 使用实例
android本地数据库,微信数据库WCDB for Android 使用实例 Home · Tencent/wcdb Wikihttps://github.com/Tencent/wcdb/wiki ...
- 性能测试工具Locust,一个开源性能测试工具
性能测试工具Locust,一个开源性能测试工具使用Python代码来定义用户行为.用它可以模拟百万计的并发用户访问你的系统.1.它与目前主流的LoadRunner和Jmeter玩法都不一样.2.它完全 ...
- HDU 1232 畅通工程 (并查集)
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可). ...
- 深入理解HashMap+ConcurrentHashMap的扩容策略
前言 理解HashMap和ConcurrentHashMap的重点在于: (1)理解HashMap的数据结构的设计和实现思路 (2)在(1)的基础上,理解ConcurrentHashMap的并发安全的 ...
- FastStone Capture无法录制系统声音解决方法(win10)
步骤一: 右键桌面-->个性化 步骤二: 主题-->高级声音设置 步骤三: 录音-->右键“立体声混音”,单击启用就OK了.
- STM32硬件IIC (转)
源: STM32硬件IIC