概述
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2708 Accepted Submission(s): 1426 Problem Description A frog has just learned some number theory, and can't wait to show his ability to his girlfriend.
Input First line contains an integer T , which indicates the number of test cases.
Output For every test case, you should output "Case #x: y", where x indicates the case number and counts from 1 and y is the number of possible starting grids.
Sample Input 3 6 10 6 8 2 8
Sample Output Case #1: 1 Case #2: 2 Case #3: 3
Source 2015ACM/ICPC亚洲区上海站-重现赛(感谢华东理工)
Recommend wange2014
|
题目大意: 有一只青蛙,它从起点(x,y)出发,每次它会走LCM(x,y)步[LCM:最小公倍数]到达点(x+LCM(x,y),y)或点(x,y+LCM(x,y)),最终,它会到达点(ex,ey),现给你终点(ex,ey),要你求出它的起点有多少种可能
思路:
可以证明:两个数的gcd一直是k,
我们发现当前位置是(x,y)时,如果x>y,那么当前位置一定是由(x1,y)走到的,如果x<y,当前位置一定是由(x,y1)走到的,由这点确定了路径的唯一性
对于(x,y),假设x>y,x=nk,y=mk,设先前点为(x1,y),则x1+gcd*x1*y=x,所以先前点为(x/(y/k+1),y),如果x不再是(y+k)的倍数(即:(y/k+1)*k的倍数),则表示不能再逆推。
重要公式:gcd(X,Y) = gcd(X, Y - K*X) = gcd(X - K * Y, Y)
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define ll long long
using namespace std;
int gcd(int a,int b)
{
return b==0?gcd(b,a%b):a;
}
int main()
{
int x,y,T;
scanf("%d",&T);
int t=0;
while(T--)
{
scanf("%d%d",&x,&y);
if(x<y)
swap(x,y);
int k=gcd(x,y),cnt=1;
while(x%(y+k)==0)
{
cnt++;
x=x/(y/k+1);
if(x<y)
swap(x,y);
}
t++;
printf("Case #%d: %dn",t,cnt);
}
return 0;
}
最后
以上就是高挑季节为你收集整理的【HDU】5584LCM Walk-(数学推导)的全部内容,希望文章能够帮你解决【HDU】5584LCM Walk-(数学推导)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复