HDU-5514 Frogs
题目大意是给定一些(n)青蛙及其跳跃的步数和方法,给定一些石头,编号从1~m,问所有曾经被青蛙跳过的石头的编号的和。
思路
容斥定理
从题目中很容易得出每一个青蛙的跳过的石头编号是k * gcd(m, frogi) {m/ gcd(m, frogi) >= k >= 1},这样用等差数列求和公式就能求出
每一个青蛙所跳过的石头编号的和。但是有一些石头是被重复计算的。这样就用到了容斥原理
wiki百科 https://en.wikipedia.org/wiki/Inclusion%E2%80%93exclusion_principle
训练时没有做出来,参考了大牛的思路。http://www.cnblogs.com/Quinte/p/4932471.html
可以先把m所有的因子求出来,排好序。 对于每一个是青蛙跳过的石头编号的倍数的因子进行标记,表示该因子做了贡献,
做贡献的次数用一个数组或者map保存起来,然后把所有因子从小到大进行扫描,如果当前因子要做贡献,则进行加和,同
时把所有是该因子倍数的因子要加和的次数减去当前因子做贡献的次数。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
#include <vector>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
const int maxn = 100000 + 10;
int n, m;
int f[maxn];
bool vis[maxn];
map<int, int> times;int gcd(int a, int b){return a == 0 ? b : gcd(b % a ,a);
}LL solve(){LL sum = 0;vector<int> fact;times.clear();memset(vis, false, sizeof vis);for(int i = 1; i <= int(sqrt(m) + 0.5); ++i){if(m % i == 0) {fact.push_back(i); times[i] = 0;if(i * i != m) {fact.push_back(m / i); times[m / i] = 0;}}}sort(fact.begin(), fact.end());for(int i = 0; i < n; ++i){int x = gcd(f[i], m);for(int j = 0; j < fact.size(); ++j){if(fact[j] % x == 0) vis[j] = true;}}fact.pop_back();//Inclusion_exclusion principlefor(int i = 0; i < fact.size(); ++i){if((int)vis[i] != times[i]){int t = m / fact[i];sum += (LL)t * (t - 1) * fact[i] / 2 * ((int)vis[i] - times[i]);t = vis[i] - times[i];for(int j = i + 1; j < fact.size(); ++j){if(fact[j] % fact[i] == 0) times[j] += t;}}}return sum;
}int main()
{int T; scanf("%d", &T);int kase = 0;while(T --){ scanf("%d %d", &n, &m);for(int i = 0; i < n; ++i ){scanf("%d",&f[i]);}printf("Case #%d: %I64d\n", ++kase, solve());}return 0;
}
HDU-5514 Frogs相关推荐
- HDU 5514 Frogs (容斥原理)
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...
- HDU 5514 Frogs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514 题目描述: 有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过 ...
- HDU 5514 Frogs 容斥
http://acm.hdu.edu.cn/showproblem.php?pid=5514 没有想到怎么利用gcd的性质来改进指数级别的容斥,还是没有理解容斥的思想,只知道基础的. 已经知道结果就在 ...
- 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(欧拉函数+数论YY)
传送门 Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5514 Frogs (容斥原理+因子分解)
题目链接 题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0 ...
- HDU - 5514 Frogs(容斥原理)
题目链接:点击查看 题目大意:给出 0 ~ m - 1 共 m 个石头首尾相连呈现出一个环状,初始时在第 0 个石头上有 n 只青蛙,n 只青蛙相互独立,每一只青蛙每次都会向前跳 a[ i ] 步,问 ...
- HDU 5514 Frogs
题意 有一群青蛙,一开始都在0点,有一堆圈石子,编号从0~m-1的. 青蛙只能顺时针跳,每个青蛙可以一次跳a[i]格,然后所有青蛙都这样一直跳下去,这些青蛙踩过的石子的编号和是多少? 思考 读了题,以 ...
- HDU - 5514 Frogs
题目大意:有n只青蛙,每只青蛙的弹跳能力为ai,他们都从0出发,绕着m个石头围成的圈子跳跃,石头编号为0~m-1,问能被跳到的石头编号之和 具体思路:首先可以发现弹跳能力为ai的青蛙,可以跳到的石头编 ...
- Frogs HDU - 5514
Frogs HDU - 5514 题意: 有n个青蛙,第 i 个青蛙每次只能够跳 ai步,现在有m个石头围成一圈,编号为0到m−1,现在青蛙可以围着这个石头组成的圆跳无限次,每跳一次就会占领这个石头 ...
最新文章
- Twitter团队最新研究:快速高效的可扩展图神经网络SIGN
- 03-老马jQuery教程-DOM操作(上)
- 长安大学第三届ACM-ICPC程序设计竞赛 E题
- C++多态,虚函数,纯虚函数
- java knn kd树_KNN算法之KD树(K-dimension Tree)实现 K近邻查询
- Ubuntu Linux 16.04 xfce下最漂亮的系统字体------文鼎粗钢笔楷体安装记录
- 40 CO配置-控制-产品成本控制-成本对象控制-实际成本核算/物料分类帐-维护材料分类帐文档的编号范围
- 04-3. 统计素数并求和(20)
- c++ 等待子线程结束_python主线程与子线程的结束顺序
- parse Json
- 网站扫描服务器全部开放端口,服务器开放端口扫描
- 番茄助手 VS2015
- 秋天的第一杯奶茶,没喝到?那这个你绝对不能再错过
- 十年职场软件工程师感悟
- 汇编语言实验——SYAU
- Pytorch版本代码修正
- Xilinx vivado 常用IP核使用
- 选购笔记本电脑型号的查询
- 回收垃圾字符的3种方法
- 泰坦科技MT4平台搭建提供一站式白标方案 快速开启外汇经纪业务
热门文章
- 幼儿园教案我和计算机比本领,幼儿园说课稿:比本领
- 手机rpg游戏存档在哪_在免费RPG日尝试新游戏
- “机器学习就是现代统计学”
- 王姨劝我学HarmonyOS鸿蒙2.0系列教程之四Git搭建下载实例!
- LeetCode-929. 独特的电子邮件地址
- centos下zip压缩解压缩命令
- TensorFlow学习--tf.summary.histogram与直方图仪表板/tensorboard_histograms
- idead文件折叠问题终极解决办法
- 赢在云端:VMware跨云架构,让“云”卷“云”舒自由可控!——访VMware公司大中华区高级技术总监李刚
- 人人都想买湖景房!湖景房优缺点你知道吗?