题目描述:有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. Ajax的基本请求/响应模型

    一.Ajax工作核心 Ajax的核心是JavaScript对象XMLHttpRequest(简称XHR).它是一种支持异步请求的技术.可以通过使用XHR对象向服务器提出请求并处理响应,而不阻塞用户. ...

  2. 淘淘商城_day10_课堂笔记

    今日大纲 Dubbo入门学习 使用dubbo优化单点登录系统 系统间服务调用方式 浏览器直接访问 浏览器发起请求,通过ajax或jsonp方式请求: Httpclient方式 系统与系统之间通过Htt ...

  3. HDU 5860 Death Sequence

    用线段树可以算出序列.然后o(1)询问. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<c ...

  4. 第五十四节,socketserver通讯模块实现并发操作,真多线程并发

    socketserver通讯模块实现并发操作,基于select.epoll.socket.多线程,实现的正真多线程多并发 socketserver通讯模块底层调用的socket模块,只是它作了处理基于 ...

  5. php 异步

    .post(handle,{username: username.val(),content: content.val()},function(data){ },'json');

  6. iOS-Runtime机制详解

    一.简介 runtime是一套底层的纯c语言的API,我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething];会被转化成objc_msgSen ...

  7. Ubuntu shortcuts

    Ubuntu shortcuts 打开系统管理器 gnome-system-monitor

  8. hdu_5908_Abelian Period(暴力)

    题目链接:hdu_5908_Abelian Period 题意: 给你n个数字,让你找出所有的k,使得把这n个数字分为k分,并且每份的数字种类和个数必须相同 题解: 枚举k,首先k必须是n的约数,然后 ...

  9. openwrt杂记

    /etc/config/wireless是在boot启动时生成的. 代码在/etc/init.d/boot中,如下: /sbin/wifi detect > /tmp/wireless.tmp  ...

  10. satisfy_dependencies_for: Cannot satisfy the following dependencies for kmod-usb-storage:

    卸载了包 : opkg remove kmod-ath9k - 3.10.49+2014-05-22-1 重新进行安装时出现如下错误: root@hbg:/tmp# opkg install /tmp ...