您的位置:首页 > 其它

【数论】hdu5584 LCM walk(数学推导)

2016-08-17 19:47 162 查看
题意:

从(x,y)点出发,到(x+z,y)或(x,y+z)z=lcm(x,y);给出终点(a,b),问有多少个可能起点。

题解:

注意到 gcd(x+z,y)==gcd(x,y+z)==gcd(x,y)就不难了。

从起点到终点gcd一定要相同。

设g=gcd(x,y);则x‘=y*g/(x+g)  注意令y>x;

推导过程中要用到lcm(x,y)=x*y/gcd(x,y);

判断gcd变化的条件可以用 y % (g + x) ==
0

代码如下:

#include <vector>
#include <map>
#include <set>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
using namespace std;
long long gcd(long long a, long long b)
{
return b == 0 ? a : gcd(b, a % b);
}

int main(){
int T;
cin >> T;
int cas = 1;
while(T--)
{
long long a,b,ans = 1;
scanf("%lld%lld",&a,&b);
if (a < b) swap(a,b);
long long g = gcd(a,b);

while((a % (g + b)) == 0)
{
a = a * g / (g + b);
ans++;
if (a < b) swap(a,b);
}
printf("Case #%d: %lld\n",cas++,ans);
}
return 0;
}


还有个更简单易懂的推法:

见博客http://www.cnblogs.com/qscqesze/p/5029555.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: