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

思路:经过绘图我们发现,每次跳过的位置一定是k*gcd(a[i], m)。然后我就不会了= =。于是看了别人的题解,方法挺好的。

找出所有的m的因子,然后对能通过gcd(a[i],m)得到的因子用vis数组标记,然后用num[i]表示该因子重复计算了几次,然后利用重复计算的次数来容斥一下就出来了。具体看代码吧

//看看会不会爆int!数组会不会少了一维!
//取物问题一定要小心先手胜利的条件
#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define ALL(a) a.begin(), a.end()
#define pb push_back
#define mk make_pair
#define fi first
#define se second
#define haha printf("haha\n")
const int maxn = 1e4 + ;
LL a[maxn];
int kase, n;
LL m;
int vis[maxn], num[maxn]; LL gcd(LL a, LL b){
return b == ? a : gcd(b, a % b);
} int main(){
int t; cin >> t;
while (t--){
scanf("%d%I64d", &n, &m);
vector<LL> v;
for (LL i = ; i <= sqrt(m) + ; i++){
if (m % i == ){
v.push_back(i);
if (i * i != m) v.push_back(m / i);
}
}
memset(vis, , sizeof(vis));
memset(num, , sizeof(num));
sort(v.begin(), v.end());
for (int i = ; i <= n; i++){
scanf("%I64d", a + i);
LL g = gcd(a[i], m);
for (int j = ; j < v.size(); j++){
if (v[j] % g == ) vis[j] = ;
}
}
LL ans = ;
for (int i = ; i < v.size(); i++){
if (vis[i] != num[i]){
LL val = v[i];
LL tmp = m / val;
ans += (val * tmp) * (tmp - ) / * (vis[i] - num[i]);
tmp = vis[i] - num[i];
///printf("tmp = %I64d val = %I64d\n", tmp, val);
for (int j = i; j < v.size(); j++){
if (v[j] % val == ) num[j] += tmp;
}
}
}
printf("Case #%d: %I64d\n", ++kase, ans);
}
return ;
}

很好的容斥思想 HDU 5514的更多相关文章

  1. hdu 5514 Frogs 容斥思想+gcd 银牌题

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

  2. 【容斥】HDU 4135 Co-prime

    acm.hdu.edu.cn/showproblem.php?pid=4135 [题意] 询问[a,b]中与n互质的数有多少个 [思路] 考虑[1,m]中与n互质的数有多少个,答案就是query(b) ...

  3. zzuli1731 矩阵(容斥)

    1731: 矩阵 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 600  Solved: 106 SubmitStatusWeb Board Descr ...

  4. HDU5794 A Simple Chess 容斥+lucas

    分析:转自http://blog.csdn.net/mengzhengnan/article/details/47031777 一点感想:其实这个题应该是可以想到的,但是赛场上并不会 dp[i]的定义 ...

  5. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  6. JZOJ5787轨道(容斥+DP)

    JZOJ5787轨道 Description 2018年1月31日,152年一遇的超级大月全食在中国高空出现(没看到的朋友真是可惜),小B看到月食,便对月球的轨道产生了兴趣.他上网查重力加速度的公式, ...

  7. 【51nod1253】Kundu and Tree(容斥+并查集)

    点此看题面 大致题意: 给你一棵树,每条边为黑色或红色, 求有多少个三元组\((x,y,z)\),使得路径\((x,y),(x,z),(y,z)\)上都存在至少一条红色边. 容斥 我们可以借助容斥思想 ...

  8. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  9. csp-s模拟测试59(10.4)「Reverse」(set)·「Silhouette」(容斥)

    A. Reverse 菜鸡wwb又不会了..... 可以线段树优化建边,然而不会所以只能set水了 发现对于k和当前反转点固定的节点x确定奇偶性所到达的节点奇偶性是一定的 那么set维护奇偶点,然后每 ...

随机推荐

  1. Jmeter组件介绍

    测试计划:一次性能测试的相关功能用例集. 测试计划--线程组添加:

  2. HDU 5834 Magic boy Bi Luo with his excited tree

    树形dp. 先dfs一次处理子树上的最优解,记录一下回到这个点和不回到这个点的最优解. 然后从上到下可以推出所有答案.细节较多,很容易写错. #pragma comment(linker, " ...

  3. C# Monads的实现(一)

    了解Haskell语言的朋友都知道它是一门纯函数式编程,输出结果只跟输入参数相关,这导致Haskell不能有输入输出函数,因为不同的环境下,输入相同,但输出可能有所不同.Haskell语言中,变量的值 ...

  4. Opencv常用函数

    一.图像读写与简单处理 1. Mat cv::imread(const String& filename, int flags=IMREAD_COLOR). imread函数加载filenam ...

  5. hdu2141AC代码分享

    #include <iostream> #include <algorithm> using namespace std; const int N = 505; /////// ...

  6. sql表命名规范

    tb_new_Count 新闻内容表:首先表加tb_,如果是视图则加V_存储过程加_p. 下划线后面要大写. 切记.(萌萌的国庆要加油)

  7. LeetCode OJ 63. Unique Paths II

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  8. Gym 100553B Burrito King 无脑背包

    题意就是你有n和m两个上限 吃一个东西会同时增加两个东西 m的值不能超过给定的m 问最后的n m值和每个东西吃了多少 贪心一下就好了 算一下性价比 从最大的开始吃 直到吃满了m n也一定是最大了 只是 ...

  9. 2015 Multi-University Training Contest 9

    1001 Expression 式子不好推啊.见官方题解. 式子知道就方便了.处理好组合数和阶乘. 按区间长度从小到大递推完就好. # include <iostream> # inclu ...

  10. vs中的各种快捷键

    1. VS注释与取消注释快捷键 CTRL + K , CTRL + C(注释) CTRL + K , CTRL + U(取消注释)