hdu 5584 gcd/lcm/数学公式

input

T  1<=T<=1000

x y

output

有多少个起点可以走n(n>=0)步走到(x,y),只能从(x,y)走到(x,y+lcm(x,y))/(x+lcm(x,y),y)

标准解:从(x,y0)走到(x,y),则设x=ag,y0=bg,g=gcd(x,y0),有y=bg+abg=(a+1)bg,因为a,b互质,a,(a+1)互质,所以a和(a+1)b互质,所以若可以从(x,y0)走到(x,y),有gcd(x,y0)=gcd(x,y),然后将x和y中gcd(x,y)除去之后不断除以(x+1)即可

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <set>
 4 #include <algorithm>
 5
 6 using namespace std;
 7
 8 typedef long long LL;
 9
10 //求最大公约数
11 LL gcd(LL a, LL b) { if(!b) return a; else return gcd(b,a%b); }
12
13 int main()
14 {
15     int t,Case = 0;
16     scanf("%d",&t);
17     while(t--)
18     {
19         LL ex,ey; //终点坐标
20
21         scanf("%lld%lld",&ex,&ey);
22         LL GCD = gcd(ex,ey);
23         ex/=GCD,ey /=GCD;
24         int ans = 0;
25         while(1)
26         {
27             if(ey < ex) swap(ex,ey);
28             ans++;
29             if(ey % (ex+1)) break;
30             ey /= (ex+1);
31         }
32
33         printf("Case #%d: %d\n",++Case,ans);
34     }
35 }

answer

 1 #include <cstdio>
 2 #include <queue>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <vector>
 8 #include <map>
 9 #include <set>
10 #include <ctime>
11 #include <cmath>
12 #include <cctype>
13 #define MAX 100000
14 #define LL long long
15 int cas=1,T,x,y,d[1000],dn;
16 void find(int x,int *d,int& dn)
17 {
18     dn=-1;
19     int m=sqrt(x);
20     for(int i=1;i<=m;i++) if(x%i==0) d[++dn]=i;
21     for(int i=dn;i>=0;i--) d[++dn]=x/d[i];
22 }
23 int gcd(int a,int b) { return b==0?a:gcd(b,a%b); }
24 int main()
25 {
26 //    freopen("in","r",stdin);
27     scanf("%d",&T);
28     while(T--)
29     {
30         scanf("%d%d",&x,&y);
31         int step=1,flag=1;
32         while(flag&&x!=y)
33         {
34             flag=0;
35             if(x>y) std::swap(x,y);
36             int g=gcd(x,y);
37             find(g,d,dn);
38             for(int i=dn;i>=0;i--)
39             {
40                 if(y%(d[i]+x)==0)
41                 {
42                     int y1=y/(d[i]+x)*d[i];
43                     if(gcd(x,y1)==d[i]) { y=y1;step++;flag=1;break; }
44                 }
45             }
46         }
47         printf("Case #%d: %d\n",cas++,step);
48     }
49     //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
50     return 0;
51 } 

My Code

时间: 2024-10-08 18:32:08

hdu 5584 gcd/lcm/数学公式的相关文章

hdu 5382 GCD?LCM!

题意:[exp]为一个判断式,若exp为真,则值为1,否则为0 F[n]=segema(1,n,segema(1,n,[lcm(i,j)+gcd(i,j)>=n])) S[n]=segema(1,n,F[i]) 解: #include <stdio.h> #include <string.h> #define ll __int64 const int maxn=5+1e6; const ll mod=258280327; int num[maxn]; int prime[ma

hdu 4497 GCD and LCM(排列组合)

题目:hdu 4497 GCD and LCM 题目大意:给出三个数的最大公约数,和最小公倍数,问这三个数的排列组合关系. 解题思路:最小公倍数/最大公约数 ==  三个数不同部分的乘积.这样来考虑的话,三个数都要有最大公约数的部分,其余的部分就是由LCM / GCD 里面的因子构成.这里面的因子可能会有 2 2 3 这样的情况, 不同的因子之间是不会相互干扰的,但是相同的会出现问题,因为,不能同时将相同的因子都放在三个位置上,这样最大公约数就的要乘上这个因子.然后对于单种因子来考虑的话,每种因

POJ 2429 GCD &amp; LCM Inverse

设答案为ans1,ans2 ans1=a1*gcd,ans2=a2*gcd,a1,a2互质 gcd*a1*b1=lcm,gcd*a2*b2=lcm a1*b1=lcm=(ans1*ans2)/gcd=a1*a2 综上所诉,a1=b2,a2=b1. 也就是说,ans1=gcd*k1,ans2=gcd*k2 要求k1,k2尽量接近,并且k1,k2互质,并且,k2*k2=lcm/gcd 需要用到Pollard_rho分解质因数,然后暴力搜索寻找k1,k2.用了kuangbin大神的Pollard_rh

Uva 11388 GCD LCM ( 数论 )

Uva  11388 GCD LCM( 数论 ) 题意: 求是否存在a,b 使得lcm(a,b) = L, gcd(a,b) = G,不存在输出-1,存在输出a,b,且a尽可能小 分析: 强行暴力是不可能的数据很大,要用llu,这里有两种思路 思路一: 由题意可知 a*b = G*L 保证a = G的倍数的情况下,枚举a再判断G*L能否整除a,最后判断b是否为a的倍数.a从G开始扫到sqrt(G*L) //输入两个整数G,L //找出a,b 使得 gcd(a,b) = G lcm(a,b) =

UVA - 11388 GCD LCM

II U C   ONLINE   C ON TEST   2 008 Problem D: GCD LCM Input: standard input Output: standard output The GCD of two positive integers is the largest integer that divides both the integers without any remainder. The LCM of two positive integers is the

HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a <= b <= 100000, c=1, c <= d <= 100000, 0 <= k <= 100000) 思路:因为x与y的最大公约数为k,所以xx=x/k与yy=y/k一定互质.要从a/k和b/k之中选择互质的数,枚举1~b/k,当选择的yy小于等于a/k时,可以

uva 11317 - GCD+LCM(欧拉函数+log)

题目链接:uva 11317 - GCD+LCM 题目大意:给定n,求出1~n里面两两的最大公约的积GCD和最小公倍数的积LCM,在10100进制下的位数. 解题思路:在n的情况下,对于最大公约数为i的情况又phi[n/i]次.求LCM就用两两乘积除以GCD即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; ty

POJ 2429 GCD &amp; LCM Inverse (大数分解)

GCD & LCM Inverse 题目:http://poj.org/problem?id=2429 题意: 给你两个数的gcd和lcm,[1, 2^63).求a,b.使得a+b最小. 思路: lcm = a * b / gcd 将lcm/gcd之后进行大数分解,形成a^x1 * b^x2 * c^x3-- 的形式,其中a,b,c为互不相同的质数.然后暴力枚举即可. 代码: #include<map> #include<set> #include<queue>

poj 2429 GCD &amp; LCM Inverse 【java】+【数学】

GCD & LCM Inverse Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9928   Accepted: 1843 Description Given two positive integers a and b, we can easily calculate the greatest common divisor (GCD) and the least common multiple (LCM) of a a