hdu5514

题意

\(m\) 个石子绕成一圈,编号\([0, m - 1]\)。有 \(n\) 个青蛙从 \(0\) 号石子出发,给出每个青蛙的步长,青蛙无限跑圈。问哪些石子至少被一个青蛙经过,求这些石子的编号之和。

分析

假设某个青蛙的步长 \(x\),则一共会经过 $ \frac{m - 1}{x} + 1$ 个石子(包括 \(0\) )。可以用等差数列求和公式计算贡献。

然后找出 \(m\) 的所有因子并考虑哪些因子可能要计算贡献。

例如步长为 \(2\) 和 \(3\) 的计算后,步长为 \(6\) 的情况被计算了两次(或者说 \(6\) 的倍数的编号被计算了两次),应该减去一次,用一个数组记录某个步长被计算了几次贡献,在统计答案的时候减去即可。

code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e4 + 10;
int a[MAXN];
int fac[MAXN];
int vis[MAXN]; // vis[i]表示fac[i]是否可能要计算贡献,如果为 0 一定不计算贡献
int num[MAXN]; // num[i]表示fac[i]被计算了几次贡献
int main() {
int T, kase = 1;
scanf("%d", &T);
while(T--) {
memset(vis, 0, sizeof vis);
memset(num, 0, sizeof num);
int n, m;
scanf("%d%d", &n, &m);
int fc = 0;
for(int i = 1; i * i <= m; i++) {
if(m % i == 0) {
fac[fc++] = i;
if(i * i != m) fac[fc++] = m / i;
}
}
sort(fac, fac + fc);
for(int i = 0; i < n; i++) {
scanf("%d", &a[i]);
a[i] = __gcd(a[i], m);
for(int j = 0; j < fc; j++) {
if(fac[j] % a[i] == 0) {
vis[j] = 1;
}
}
}
ll ans = 0;
for(int i = 0; i < fc - 1; i++) {
ll k = (m - 1) / fac[i];
ans += (k + 1) * k * fac[i] / 2 * (vis[i] - num[i]);
for(int j = i + 1; j < fc - 1; j++) {
if(fac[j] % fac[i] == 0) {
num[j] += vis[i] - num[i];
}
}
}
printf("Case #%d: %lld\n", kase++, ans);
}
return 0;
}

hdu5514的更多相关文章

  1. 从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)

    The greatest common divisor GCD(a,b) of two positive integers a and b,sometimes written (a,b),is the ...

  2. HDU5514 Frogs

    /* HDU5514 Frogs http://acm.hdu.edu.cn/showproblem.php?pid=5514 容斥原理 * * */ #include <cstdio> ...

  3. hdu5514 非2的次幂容斥原理

    /* 1 126 223092870 210 330 390 462 510 546 570 690 714 770 798 858 910 966 1122 1155 1190 1254 1326 ...

  4. 【做题】hdu5514 Frogs——另类容斥

    题意是给出n个m的约数,问[0,m-1]中至少被其中一个约数整除的整数和.(n<=10000,m<=1000000000) 直接容斥的话,是2^n再拖个log的复杂度,加上当前的数大于m时 ...

  5. HDU5514——容斥原理&&gcd

    题目 链接 有n只青蛙,有m块石头,编号为0-m-1,第i只青蛙每次可以跳$a_i$, 刚开始都在0,问,青蛙总共可以跳到的石头之和为多少.其中$t≤20$,$1≤n≤10^4$,$1≤m≤10^9$ ...

随机推荐

  1. [洛谷P3690]【模板】Link Cut Tree (动态树)

    题目大意:给定$n$个点以及每个点的权值,要你处理接下来的$m$个操作.操作有$4$种.操作从$0到3编号.点从1到n编号. $0,x,y$:代表询问从$x$到$y$的路径上的点的权值的$xor$和. ...

  2. 【ZJ选讲·压缩】

    给一个由小写字母组成的字符串(len<=50) 我们可以用一种简单的方法来压缩其中的重复信息. 用M,R两个大写字母表示压缩信息 M标记重复串的开始, R表示后面的一段字符串重复从上一个 ...

  3. 【BZOJ 3669】 [Noi2014]魔法森林 LCT维护动态最小生成树

    这道题看题意是在求一个二维最小瓶颈路,唯一可行方案就是枚举一维在这一维满足的条件下使另一维最小,那么我们就把第一维排序利用A小的边在A大的情况下仍成立来动态加边维护最小生成树. #include &l ...

  4. ar用法小记

    ar是用来创建.修改或者从档案文件中提取的GNU程序,它被认为是一个二进制的工具,因为它最大的应用就是将一些子程序归档为库文件. 用法概述 ar [-]p[mod [relpos] [count]] ...

  5. 移动端H5滚动穿透解决方案

    最近遇到一个很 巨恶心的问题  ios10下面 页面弹窗有滚动穿透问题 各种google 终于找到了答案,但是体验还不是很好,基本能忍受 废话不多说,上方法 最后终于想到一个处理方案,就是第一种方案的 ...

  6. spring @Profile的运用示例

    @Profile的作用是把一些meta-data进行分类,分成Active和InActive这两种状态,然后你可以选择在active 和在Inactive这两种状态 下配置bean, 在Inactiv ...

  7. 两数之和 [ leetcode ]

    原题地址:https://leetcode-cn.com/articles/two-sum/ 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元 ...

  8. 获取oracle当前系统设置了哪些事件

    ALTER SESSION SET EVENTS '10046 trace name context forever,level 12' 会话已更改. DECLARE EVENT_LEVEL NUMB ...

  9. JavaScript中Array(数组)的属性和方法(转)

    数组有四种定义的方式 使用构造函数:var a = new Array();var b = new Array(8);var c = new Array("first", &quo ...

  10. 关于ora-12154:TNS:could not resolve the connect identifier specified

    一:前言 刚刚出来实习,在公司配的电脑里面装的oracle和PL SQL时一次性就搞定,但是在自己的电脑上装了就出现这个问题,刚刚在网上看了下,所以自己就写份记载吧! 二: 在打开PLSQL Deve ...