HDU 5514 Frogs (容斥原理)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514
题意 :
有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i]个石子
问所有被至少踩过一次的石子的序号之和
思路 :
不难发现, 从0开始, 每次越过a[i]个石子, 那么gcd(a[i], m)的倍数都能被经过
石子 k * (gcd(a[i], m)) < m 的都被算入
但如果按单独每个a[i]来计算对答案的贡献, 肯定会有重复, 重复部分就是lcm(a[i], a[j])的倍数
这里要用容斥的思想解决
第一次正式接触容斥, 但其实已经有很多地方用过这种思想了
比如二维树状数组求面积, 求一个范围内能整除若干个数的个数, 还有某些概率计算
这道题中, 考虑每个gcd(a[i], m)的贡献时
首先 x = gcd(a[i], m) 一定是m的因子, x的贡献是 (m / x) * (m / x - 1) * / 2 * x
因为Sum(k * x) (1 <= k < m / x), 提取x为公因子, k就是一个等差数列求和
此时若有 y = gcd(a[j], m), y % x == 0, 则要减去一次y产生的贡献
所以解法是, 先用处理出所有m的因子, 储存在一个数组d中
对每个a[i], 都算出x = gcd(a[i], m), 遍历m的因子,
若d[i] % m == 0, 就将这个因子的贡献标记为1, vis[i] = 1, 表示这个因子应该做贡献
用一个数组记录每个因子做过的贡献, 一开始全为0
再遍历m的因子, 如果当前这个因子应该做的贡献和已经做的贡献不等, 补上贡献的次数是vis[i] - num[i]
所以套用计算贡献的公式, 当前因子x做的贡献为(m / x) * (m / x - 1) * / 2 * x * (vis[i] - num[i])
这时就要用容斥了, 这些因子中, 如果有y能整除x, x进行贡献的同时, 因子y也同时被贡献了vis[i] - num[i]次
那么对应因子y的num[j]就要加上vis[i] - num[i]
如果出现了vis[i] - num[i] < 0的情况, 说明这个因子被多贡献了, 减去相应次数的贡献即可
重现没有做出来, 代码是参考了网上大牛的
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; typedef long long LL; const int MAXN = 1e4+; int a[MAXN];
int d[MAXN];
int vis[MAXN];
int num[MAXN]; int GCD(int a, int b)
{
int r = a % b;
while(r) {
a = b;
b = r;
r = a % b;
}
return b;
} bool cmp(int a, int b)
{
return a < b;
} void Init()
{
memset(vis, , sizeof(vis));
memset(num, , sizeof(num));
} int main()
{
int t;
int n, m; scanf("%d", &t);
for(int cas = ; cas <= t; cas++) {
Init();
scanf("%d %d", &n, &m);
int cnt = ;
for(int i = ; i * i <= m; i++) {
if(m % i == ) {
d[cnt++] = i;
if(i * i != m) {
d[cnt++] = m / i;
}
}
}
sort(d, d+cnt, cmp);
for(int i = ; i < n; i++) {
scanf("%d", &a[i]);
a[i] = GCD(a[i], m);
for(int j = ; j < cnt; j++) {
if(d[j] % a[i] == ) {
vis[j] = ;
}
}
}
LL ans = ;
vis[cnt-] = ;
for(int i = ; i < cnt; i++) {
if(vis[i] != num[i]) {
LL temp = m / d[i];
ans += temp * (temp - ) / * d[i] * (vis[i] - num[i]);
for(int j = i + ; j < cnt; j++) {
if(d[j] % d[i] == ) {
num[j] += vis[i] - num[i];
}
}
}
}
printf("Case #%d: %I64d\n", cas, ans);
} return ;
}
HDU 5514 Frogs (容斥原理)的更多相关文章
- HDU 5514 Frogs (容斥原理+因子分解)
题目链接 题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0 ...
- hdu 5514 Frogs(容斥)
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5514 Frogs(容斥原理)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5514 [题目大意] m个石子围成一圈,标号为0~m-1,现在有n只青蛙,每只每次跳a[i]个石子, ...
- HDU 5514 Frogs 容斥定理
Frogs Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5514 De ...
- HDU 5514 Frogs
Frogs Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5514 ...
- HDU 5514 Frogs 欧拉函数
题意: 有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\). 现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4 ...
- HDU 5514 Frogs (数论容斥)
题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 析:首先可以知道的是第 i 只青蛙可以跳到 k * gcd(ai, m),然后我就计 ...
- hdu 5514 Frogs 容斥思想+gcd 银牌题
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
- HDU 5514.Frogs-欧拉函数 or 容斥原理
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
随机推荐
- iOS网络HTTP、TCP、UDP、Socket 知识总结
OSI 七层模型 我们一般使用的网络数据传输由下而上共有七层,分别为物理层.数据链路层.网络层.传输层.会话层.表示层.应用层,也被依次称为 OSI 第一层.第二层.⋯⋯. 第七层. 如下图: 各层功 ...
- MiniProfiler.EF6监控调试MVC5和EF6的性能
转自:蓝狐学MVC教程 以前开发Webform的时候可以开启trace来跟踪页面事件,这对于诊断程序的性能是有很大的帮助的,起到事半功倍的作用,今天我就来谈用mvc开 发项目的调试和性能监控.EF框架 ...
- Razor html标签
1.Label Html语法: <label for=“UserName”>用户名</label> Razor语法: @Html.LabelFor(m=>m.UserNa ...
- (转)ECSHOP给分类添加代表图
转之--http://www.cnblogs.com/wangblognet/archive/2012/12/09/2809916.html ecshop的模板有很多不完善的地方,比如添加商品分类的时 ...
- javascript 获取用户光标,插入文本
图1 如图1所示,点击[函数名称],将函数名称添加到表达式内容框中,点击参数名称,将参数名称index1作为方法的参数添加到表达式内容中的表达式中. 该功能实现主要是采用了javascript获取鼠标 ...
- L-value 和 R-value.
An L-value is something that can appear on the left side of an equal sign, An R-value is something t ...
- .net判断用户使用的是移动设备还是PC
using System.Text.RegularExpressions;//头部引入正则的命名空间 //为了加强准确性,防止支持wap的浏览器如opera,加入操作系统验证.openwave|后为p ...
- IOS改变状态栏样式
1.状态栏高亮颜色 在info.plist中添加 View controller-based status bar appearance 设置为 "NO"在AppDelegate. ...
- openstack nova数据库计算结点IP地址
最近遇到一个问题就是在控制结点上查找nova数据库中 select * from compute_nodes\G;中出现IP地址一直是127.0.0.1不是计算结点的IP,就算修改成计算结点的IP,也 ...
- Java简介(1)
起源 略. 组成 Java由四方面组成: 1.Java编程语言 2.Java文件格式 3.Java虚拟机(JVM) 4.Java应用程序接口(Java api) 体系 JavaSE , JavaEE, ...