ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AcWing 1223. 最大比例

2021-02-28 19:33:01  阅读:228  来源: 互联网

标签:1223 gcd LL b1 比例 ay ax include AcWing


原题链接

考察:最大公约数

思路:

        设原序列为a1,a2,a3...an,公比为(q/p)t,题目给的样例是在a数组中随机抽取一些数,形成新序列 b1,b2,b3...bn,可以发现b2/b1 = (q/p)k1 b3/b1 = (q/p)k2  ,显而易见k1与k2都是t的倍数,对k求最大公约数就是t.

       在未知指数的情况下,求指数的最大公约数用辗转相减法更方便.gcd(ax,ay) = agcd(x,y) = agcd(y,x-y) = gcd(ay,ax-y)  = gcd(ay,ax/ay).如果用辗转相除法只能是%,%涉及分数,需要开根号.

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 using namespace std;
 5 const int N = 110;
 6 typedef long long LL;
 7 typedef pair<LL,LL> PLL;
 8 vector<LL> v;
 9 PLL p[N];
10 LL gcd_sub(LL a,LL b)
11 {
12     if(a<b) swap(a,b);
13     if(b==1) return a;
14     return gcd_sub(b,a/b);
15 }
16 LL gcd(LL a,LL b)
17 {
18     return b?gcd(b,a%b):a;
19 }
20 int main()
21 {
22     int n;
23     scanf("%d",&n);
24     for(int i=1;i<=n;i++)
25     {
26         LL x; scanf("%lld",&x);
27         v.push_back(x);
28     }
29     sort(v.begin(),v.end());
30     v.erase(unique(v.begin(),v.end()),v.end());
31     if(v.size()==1) {printf("%d/%d\n",1,1); return 0;}
32     for(int i=1;i<v.size();i++)
33     {
34         LL d = gcd(v[i],v[0]);
35         p[i].first = v[i]/d;
36         p[i].second = v[0]/d;
37     }
38     LL d1 = p[1].first,d2 = p[1].second;
39     for(int i=1;i<v.size();i++)
40         d1 = gcd_sub(d1,p[i].first),d2 = gcd_sub(d2,p[i].second);
41     printf("%lld/%lld\n",d1,d2);
42     return 0;
43 }

 

标签:1223,gcd,LL,b1,比例,ay,ax,include,AcWing
来源: https://www.cnblogs.com/newblg/p/14460168.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有