分析
理论参考 辗转相减法
见注释
#include<iostream>
#include<cstring>
#include<algorithm>
#include<set>
using namespace std;
#define ffor(i,s,e) for(int i=s;i<e;i++)
#define out(x) cout<<x<<" "
#define nl cout<<endl
#define read(x) scanf("%lld",&x)
typedef long long LL;
const int N=105;
//data
int n;
LL a[N];
LL up[N],down[N];
//fun
void init(){
read(n);
set<LL> has;
int idx=0;
ffor(i,0,n){
LL t;
read(t);
if(!has.count(t)){
has.insert(t);
a[idx]=t;
++idx;
}
}
n=idx;
sort(a,a+idx);
}
LL gcd(LL a,LL b) {
if(a==0) return b;
if(b==0) return a;
while(b^=a^=b^=a%=b);//三异或加一余
return a;
}
LL gcd_sub(LL a,LL b)//辗转相减
{
if(b>a) swap(a,b);
if(b==1) return a;
return gcd_sub(b,a/b);
}
void updown(){
ffor(i,1,n){
LL x=a[i-1],y=a[i];
LL _gcd=gcd(x,y);
up[i]=y/_gcd;
down[i]=x/_gcd;
}
}
void getAns(){
int a=up[1],b=down[1];
ffor(i,2,n){
a=gcd_sub(up[i],a);
b=gcd_sub(down[i],b);
}
cout<<a<<"/"<<b<<endl;
}
//Ac flow
void Ac(){
init();
updown();
getAns();
}
int main(){
Ac();
return 0;
}
gcd的几种写法
//way1
#include <algorithm>
int gcd(int a,int b) {
return __gcd(a,b);
}
//way2
int gcd(int a,int b) {
return b>0 ? gcd(b,a%b):a;
}
//way3
inline int gcd(int a,int b) {
int r;
while(b>0) {
r=a%b;
a=b;
b=r;
}
return a;
}
厉害啊啊啊
我再说说我的想法吧,因为是指数用辗转相减法,所以整体上就是相除法,如果用的是相除法,则到了整体就变成相减法了,那样必定超时,如果不对请纠错。谢谢大佬
大佬牛逼,写的太好了
!!!!!!完美解决了我关于为什么要用辗转相减法的疑惑!!谢谢佬!!!!