HDU5514——容斥原理&&gcd
题目
有n只青蛙,有m块石头,编号为0~m-1,第i只青蛙每次可以跳$a_i$, 刚开始都在0,问,青蛙总共可以跳到的石头之和为多少。其中$t≤20$,$1≤n≤10^4$,$1≤m≤10^9$,$1≤a_i≤10^9$.
分析
根据裴蜀定理知,对于一个有n个点的环,每个循环节的长度为n/gcd(n, k),k为每次走的步数。所以青蛙可以达到的石头编号肯定是$gcd(m,a_i)$的倍数,相当于真正步长为$gcd(m,a_i)$.
当然要容斥一下,不就是奇加偶减吗,枚举所有的项有$2^n$个($n$是gcd的个数),还要加剪枝,如果当前的lcm是gcd[i]的倍数,那么可以不继续容斥下去(也就是对答案没有贡献).
#include<cstdio>
#include<algorithm>
using namespace std; typedef long long ll;
const int maxn = + ;
ll n, m;
ll fac[maxn], cnt, sum; ll gcd(ll a, ll b)
{
return b == ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);
} void dfs(int pos, ll tlcm, int sz)
{
//printf("pos:%d tlcm:%lld sz:%d\n", pos, tlcm, sz);
if(tlcm >= m) return;
if(pos == cnt)
{
if(sz == ) return;
if(sz & )
{
ll tmp = (m-) / tlcm;
sum += tmp * (tmp+) * tlcm / ; //o tlcm 2*tlcm... tmp*tlcm 奇加偶减
}
else
{
ll tmp = (m-) / tlcm;
sum -= tmp * (tmp+) * tlcm / ; //o tlcm 2*tlcm... tmp*tlcm
}
return;
}
if(tlcm % fac[pos] == ) return;
dfs(pos+, tlcm, sz);
dfs(pos+, lcm(tlcm, fac[pos]), sz+);
} int main()
{
int T, kase = ;
scanf("%d", &T);
while(T--)
{
scanf("%lld%lld", &n, &m);
bool flag= false;
for(int i = ;i < n;i++)
{
ll tmp;
scanf("%lld", &tmp);
fac[i] = gcd(tmp, m);
if(fac[i] == ) flag = true;
}
printf("Case #%d: ", ++kase);
if(flag)
{
printf("%lld\n", (m-) * m / );
}
else
{
sort(fac, fac+n);
cnt = unique(fac, fac+n) - fac;
sum = ;
dfs(, , );
printf("%lld\n", sum);
}
}
return ;
}
网上更多的解法是分析m的因子,求贡献。(然而没有看懂)
参考链接:http://www.acmtime.com/?p=864
HDU5514——容斥原理&&gcd的更多相关文章
- hdu (欧拉函数+容斥原理) GCD
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1695 看了别人的方法才会做 参考博客http://blog.csdn.net/shiren_Bod/ar ...
- [CQOI2014]数三角形 组合数 + 容斥 + gcd
推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...
- HDU 1695 GCD (欧拉函数+容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU1695 GCD (欧拉函数+容斥原理)
F - GCD Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Stat ...
- HDU 1695 GCD (容斥原理+欧拉函数)
题目链接 题意 : 从[a,b]中找一个x,[c,d]中找一个y,要求GCD(x,y)= k.求满足这样条件的(x,y)的对数.(3,5)和(5,3)视为一组样例 . 思路 :要求满足GCD(x,y) ...
- UVa 1393 (容斥原理、GCD) Highways
题意: 给出一个n行m列的点阵,求共有多少条非水平非竖直线至少经过其中两点. 分析: 首先说紫书上的思路,编程较简单且容易理解.由于对称性,所以只统计“\”这种线型的,最后乘2即是答案. 枚举斜线包围 ...
- HDU 1695 GCD(欧拉函数+容斥原理)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, ...
- HDU 1695 GCD#容斥原理
http://acm.hdu.edu.cn/showproblem.php?pid=1695 翻译题目:给五个数a,b,c,d,k,其中恒a=c=1,x∈[a,b],y∈[c,d],求有多少组(x,y ...
- GCD(关于容斥原理)
Problem Description Given 5 integers: a, b, c, d, k, you're to find x in a...b, y in c...d that GCD( ...
随机推荐
- HanLP封装为web services服务的过程介绍
前几天的召开的2019年大数据生态产业大会不知道大家关注到没有,看到消息是hanlp2.0版本发布了.不知道hanlp2.0版本又将带来哪些新的变化?准备近期看能够拿到一些hanlp2.0的资料,如果 ...
- Apache + PHP Yii框架跨域访问API
其实不用在Yii框架中设置任何东西,直接用Ajax调用不同域名的API即可 但是Apache中要这么设置: 首先编辑httpd.conf 去掉这一句的注释:LoadModule headers_ ...
- Junit测试类中如何调用Http通信
在使用Junit做测试的时候,有时候需要调用Http通信,无论是request还是response或者是session会话,那么在测试类里该如何调用呢,其实很简单,spring给我们提供了三个类 or ...
- Antd组件库,利用Menu组件模拟一个简单Tree组件
当前工作中,前端的主要技术栈用是vue. 那React怎么办呢?总不至于把他扔在墙角吧! 只能在一些很小的项目上,也只有自己一个前端的时候,悄悄的上React. 当然,React项目UI组件还是最喜欢 ...
- 怎样使用yum安装nginx
yum install -y nginx 以上.
- axios 跨域携带cookie设置
import axios from 'axios' // 创建axios实例 const service = axios.create({ baseURL: process.env.BASE_API, ...
- 谈谈对Spring IOC的理解(转发)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- React virtual DOM explained in simple English/简单语言解释React的虚拟DOM
初学React,其中一个很重要的概念是虚拟DOM,看了一篇文章,顺带翻译一下. If you are using React or learning React, you must have hear ...
- C#使用phantomjs,爬取AJAX加载完成之后的页面
1.开发思路:入参根据apiSetting配置文件,分配静态文件存储地址,可实现不同站点的静态页生成功能.静态页生成功能使用无头浏览器生成,生成之后的字符串进行正则替换为固定地址,实现本地正常访问. ...
- Install CUDA 6.0 on Ubuntu 14.04 LTS
Ubuntu 14.04 LTS is out, loads of new features have been added. Here are some procedures I followed ...