题意:
从(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
本文探讨了一道数学题目,即从一个起点到特定终点的所有路径中,如何找到所有可能的起点,使得这些路径上的最大公约数保持不变。文章提供了详细的解析过程,并附带了C++代码实现。
665

被折叠的 条评论
为什么被折叠?



