题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5514

题目描述:

  有n只青蛙,m个石头(围成圆圈)。第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少?

解题思路:

  第i只青蛙只能走到gcd(ai, m)的位置,我们就可以把m的因子提取出来,然后对青蛙能走到的因子位置打标记。青蛙能走到vis[i]因子位置就把vis[i]标记为1,然后num[i]表示m的第i个因子泪加的次数。如果vis[i]!=num[i]的话,就更新num。因子的个数大概是log2(m),所以时间复杂度大概为O(log2(m)2)。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long LL;const int maxn = 1e5 + 10;
int vis[maxn], num[maxn];
int p[maxn];
int gcd(int a, int b)
{return b? gcd(b, a%b) : a;
}
int main()
{int T, n, m, pos, a;scanf("%d", &T);for(int cas = 1; cas <= T; cas++){scanf("%d%d", &n, &m);int k = (int)sqrt(m);pos = 0;for(int i = 1; i <= k; i++){if(m%i == 0){p[pos++] = i;if(i*i != m)p[pos++] = m/i;}}memset(vis, 0, sizeof(vis));memset(num, 0, sizeof(num));sort(p, p+pos);for(int i = 0; i < n; i++){scanf("%d", &a);int t = gcd(a, m);for(int j = 0; j < pos; j++)if(p[j]%t == 0)vis[j] = 1;}vis[pos-1] = 0;LL ans = 0;for(int i = 0; i < pos; i++){if(vis[i] != num[i]){int t = (m-1)/p[i];ans += (LL)t*(t+1)/2 * p[i] * (vis[i]-num[i]);t = vis[i] - num[i];for(int j = i; j < pos; j++)if(p[j]%p[i] == 0)num[j] += t;}}printf("Case #%d: %lld\n", cas, ans);}return 0;
}

HDU 5514 Frogs相关推荐

  1. HDU 5514 Frogs (容斥原理)

    题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=5514 题意 : 有m个石子围成一圈, 有n只青蛙从跳石子, 都从0号石子开始, 每只能越过a[i] ...

  2. HDU 5514 Frogs 容斥

    http://acm.hdu.edu.cn/showproblem.php?pid=5514 没有想到怎么利用gcd的性质来改进指数级别的容斥,还是没有理解容斥的思想,只知道基础的. 已经知道结果就在 ...

  3. HDU 5514 Frogs 欧拉函数

    题意: 有\(m(1 \leq m \leq 10^9)\)个石子排成一圈,编号分别为\(0,1,2 \cdots m-1\). 现在在\(0\)号石头上有\(n(1 \leq n \leq 10^4 ...

  4. HDU 5514 Frogs(欧拉函数+数论YY)

    传送门 Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  5. HDU 5514 Frogs (容斥原理+因子分解)

    题目链接 题意:有n只青蛙,m个石头(围成圆圈).第i只青蛙每次只能条ai个石头,问最后所有青蛙跳过的石头的下标总和是多少? 题解:暴力肯定会超时,首先分解出m的因子,自己本身不用分,因为石头编号是0 ...

  6. HDU - 5514 Frogs(容斥原理)

    题目链接:点击查看 题目大意:给出 0 ~ m - 1 共 m 个石头首尾相连呈现出一个环状,初始时在第 0 个石头上有 n 只青蛙,n 只青蛙相互独立,每一只青蛙每次都会向前跳 a[ i ] 步,问 ...

  7. HDU 5514 Frogs

    题意 有一群青蛙,一开始都在0点,有一堆圈石子,编号从0~m-1的. 青蛙只能顺时针跳,每个青蛙可以一次跳a[i]格,然后所有青蛙都这样一直跳下去,这些青蛙踩过的石子的编号和是多少? 思考 读了题,以 ...

  8. HDU - 5514 Frogs

    题目大意:有n只青蛙,每只青蛙的弹跳能力为ai,他们都从0出发,绕着m个石头围成的圈子跳跃,石头编号为0~m-1,问能被跳到的石头编号之和 具体思路:首先可以发现弹跳能力为ai的青蛙,可以跳到的石头编 ...

  9. Frogs HDU - 5514

    Frogs HDU - 5514 题意: 有n个青蛙,第 i 个青蛙每次只能够跳 ai​步,现在有m个石头围成一圈,编号为0到m−1,现在青蛙可以围着这个石头组成的圆跳无限次,每跳一次就会占领这个石头 ...

最新文章

  1. css3属性box-sizing:border-box 用法解析
  2. Oracle-HWM(High Water Mark) 高水位解读
  3. 判断字符串NSString是否是整形或者浮点型
  4. windows配置solr5.5.2(不通过tomcat,使用内置jetty)
  5. LeetCode【7--整数反转】 LeetCode【8--字符串转整数】
  6. sql 解锁被锁定的账号
  7. linux rpm包,安装路径查看及改变rpm包默认安装路径
  8. urllib2.URLError: urlopen error [Errno 111] Connection refused
  9. linux8如何开启多个桌面,CentOS8安装GNOME3桌面并设置开机启动图形界面
  10. 全国大数据分析系统基于vue echarts
  11. ahjesus sql2005+游标示例
  12. StyleWriter英文润色软件使用说明(含破解安装包)
  13. 2022年茶艺师(中级)考试题及茶艺师(中级)考试技巧
  14. Microsoft Teams安排 Teams 实时事件
  15. 登录起凡是显示计算机拒绝无法连接,起凡名将录出现第三方登陆失败怎么办 解决方案一览...
  16. 棋牌---这些年使用过的技术
  17. U-BOOT添加命令
  18. java毕业生设计寻艺画室网站计算机源码+系统+mysql+调试部署+lw
  19. Win11桌面右下角水印怎么去除?
  20. 制作OTA升级整包增量包

热门文章

  1. 幼儿园教案我和计算机比本领,幼儿园说课稿:比本领
  2. [Editing] TP-LINK740N v5 firmware Crack
  3. 磁带机LTO类型简单介绍(Tape drive LTO type)
  4. 【边做项目边学Android】手机安全卫士07-手机防盗之进入限制
  5. 新海诚画集[秒速5センチメートル:樱花抄·铁道]
  6. H5浪漫告白气球表白
  7. 【java基础】java继承从“我爸是李刚”讲起
  8. 「递归」第4集 | 退役黑客带你走进白帽子的江湖
  9. Spring Cloud kubernetes入门项目sck-demo
  10. YOUTH(年轻)——Samuel Ullman(塞缪尔·乌尔曼)