hdu5584 LCM Walk

2024-03-02 08:48
文章标签 walk lcm hdu5584

本文主要是介绍hdu5584 LCM Walk,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 题目链接:

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=5584
题意:
两个数 ( a , b ) (a,b) (a,b),经过一次操作阔以变成(a+lcm,b)或(a,b+lcm),现在给出(a,b),问经过有限次的操作(阔以是0次),能变成(aa,bb)的(a,b)有多少种?

重现赛的时候,队友写的搜索,我一直在推,他写的搜索T了,我的样例还没写出来。。。然后又过了一会儿,他优化的记下,结果就过了。。。。。。

我发现这两个好像是相等的:
g c d ( a , b ) = g c d ( a , b + l c m ) gcd(a,b)=gcd(a,b+lcm) gcd(a,b)=gcd(a,b+lcm)
因为:
假如a=kx,b=ky
上面就是 g c d ( k x , k y ) = g c d ( k x , k x y ) gcd(kx,ky)=gcd(kx,kxy) gcd(kx,ky)=gcd(kx,kxy)
很明显应该是相等的
假如说都gcd都等于d
因为lcm肯定是大于等于a,b的,所以假设给的aa,bb都是bb比较大,所以加的lcm都加在bb上

a a = a aa=a aa=a
b b = b + l c m bb=b+lcm bb=b+lcm

a a = a aa=a aa=a
b b = b + a b d bb=b+\frac{ab}{d} bb=b+dab= b ⋅ ( 1 + a d ) b\cdot (1+\frac{a}{d}) b(1+da)

所以:
a = a a a=aa a=aa
b = b b 1 + a d b=\frac{bb}{1+\frac{a}{d}} b=1+dabb(要除得尽才行)

所以根据所给的aa,bb就能找出上一次的a,b了
但是(6,8)这个样例就让把我hack了,明明只到(2,6)就阔以了啊,结果算到了(2,3),但是我发现(2,3)的gcd不等于原来的,到这里就阔以停止了

#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const int MOD=1e9+7;
LL d;
LL dfs(LL x,LL y)
{if(x>y)swap(x,y);LL a1=-1,b1=-1;LL sum=0;if(y%(1+x/d)==0)//要除得尽才行 {a1=x,b1=y/(1+x/d);if(__gcd(a1,b1)==d){sum+=dfs(a1,b1);sum++;//这条路径上的每个点都是一种情况 }}if(__gcd(a1,b1)!=d)return 1;//如果gcd不等于原来的就直接停止了 else return sum;
}
int main()
{int T;cin>>T;for(int Case=1;Case<=T;Case++){LL x,y;cin>>x>>y;d=__gcd(x,y);cout<<"Case #"<<Case<<": "<<dfs(x,y)<<endl;}
}

这篇关于hdu5584 LCM Walk的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/765560

相关文章

array_walk()使用

bool  array_walk (  array &$array ,  callable $callback [,  mixed $userdata = NULL ] ) 将用户自定义函数 funcname 应用到 array 数组中的每个单元。 array_walk() 不会受到 array 内部数组指针的影响。array_walk() 会遍历整个数组而不管指针的位置。 array

GCD LCM

GCD(最大公约数) 欧几里得算法(辗转相除法) 原理 if(a%b==0) GCD=b else GCD=b%(a%b) 设 a ≥ b a\ge b a≥b: 若 a m o d b = = 0 a\mod b==0 amodb==0,则 g c d ( a , b ) = = b gcd(a,b)==b gcd(a,b)==b(整除性质); 若 a m o d b ! = 0 a

颠覆多跳事实验证!Causal Walk 前门调整技术引领去偏新纪元

Causal Walk: Debiasing Multi-Hop Fact Verifcation with Front-Door Adjustment 论文地址: Causal Walk: Debiasing Multi-Hop Fact Verification with Front-Door Adjustment| Proceedings of the AAAI Conference

python-小知识点 --- 使用os.walk()遍历目录文件,文件按序号统一重命名

os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情 语法: os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]]) 参数 top – 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。 root 所指的是当前正在遍历的这个文件夹的本

BZOJ 1025 游戏 DP+lcm+素数筛选

排数=lcm{Ai,Ai表示循环节长度},sum(Ai)=n根据lcm的定义,分解质因数拆掉Ai=p1^x1*p2^x2*...*pk^xklcm=∏(pi^max{xi})所以我们只看max{xi}即可,即忽略掉≤max{xi}的其它因子。所以问题等价于:sum(pi^xi)≤n的方案数。然后随便dp即可设d(i,j) 表示前i个质数和为j的方案,有d(i,j)=d(i−1,j)+sum(d(i

uva 11388 GCD LCM(数学:水题)

给定两个数的最大公约数和最小公倍数,问是否存在两个数a b满足条件 若存在输出a最小的情况,否则输出-1 因为最小公倍数恒为最大公约数的倍数。。。所以只要满足这个条件就可以了 代码如下: #include <cstdio>#include <iostream>#include <algorithm>#define LL long longusing namespace std;

ZOJ 2836 Number Puzzle 容斥、lcm

这题和HDU 1796差不多。 code: #include <cstring>#include <iostream>#include <cstdlib>#include <cstdio>#include <vector>#include <algorithm>using namespace std;typedef long long LL;const int MAXN =

HDU 1796 How many integers can you find 容斥、lcm

题意: 输入n和m个数。问你小于n中,有几个数能够被m个数中的任意一个整除的。 思路: 容斥+lcm(最小公倍数) 设m数组中结果为{a1,a2,a3,……,am}; 1.加上n/a1,n/a2,n/a3……的个数。 2.减去n/lcm(a1,a2),n/lcm(a1*a3),……,n/lcm(a2*a3),n/lcm(a2*a4),……; 3.加上三个集合的,然后减去四个集合的,加

LCM — Least Common Multiple 最小公倍数

因为任何一个数都可以表示为若干个质数幂的乘积。 比如75 = 3*5*5,即 2^0 * 3^1 * 5^2 * 7^0 ... 那么对于两个数来说,gcd就是他们取每个质数的较小幂的乘积,lcm则相反。显然,这些幂加起来就是他们乘积。 gcd(a,b) * lcm(a,b) = a*b OI Wiki: 板子:  int gcd(int a, int b){if (a

UVa 10596: Morning Walk

这题需要判断两个地方:所有点是否在同一个集合中以及各点的度是否均为偶数(即是否可以构成欧拉回路)。 用dfs得到一个连通分量中点的个数,判断是否与总的点数目相等即可知道是否所有点均在一个连通分量中。 我的代码如下: #include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <cst