1 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N=1e4+10, Base=10000; int T; struct node { int len,a[N/3]; node(){len=1;memset(a,0,sizeof(a));} }; char s[N]; node Init() { node no; scanf("%s",s+1); int len=strlen(s+1); for(int i=1,j;i<=len;i++) { j=(len - i + 4) / 4; no.a[j]=no.a[j]*10+s[i]-'0'; } no.len=(len+3)/4; return no; } int Cmp(node n1,node n2) { if(n1.len>n2.len) return 1; if(n1.len<n2.len) return -1; for(int i =n1.len; i>=1;i--) { if(n1.a[i]>n2.a[i]) return 1; if(n1.a[i]<n2.a[i]) return -1; } return 0; } void Chu(node &no, int x) { for(int i =no.len,t=0;i>=1;i--) { t=t*Base+no.a[i]; no.a[i]=t/x; t%=x; } while(no.a[no.len]==0 && no.len>1) no.len--; } void jianfa(node &n1,node n2) { for(int i=1;i<=n1.len;i++)n1.a[i]-=n2.a[i]; for(int i=1;i<=n1.len;i++) { if(n1.a[i]<0) { n1.a[i]+=Base; n1.a[i+1]--; } } while(n1.a[n1.len]==0 && n1.len>1) n1.len--; } void Gcd(node &n1,node &n2, int &t) { if(Cmp(n1,n2)==0) return; if(Cmp(n1,n2)<0) { Gcd(n2,n1,t);return; } int t1=0,t2=0; if(n1.a[1]%2==0){Chu(n1,2);t1=1;} if(n2.a[1]%2==0){Chu(n2,2);t2=1;} if(t1 && t2) Gcd(n1,n2, ++t); else if(!t1 && !t2){jianfa(n1,n2);Gcd(n1,n2,t);} else Gcd(n1,n2,t); } void Print(node no) { printf("%d", no.a[no.len]); for(int i=no.len-1;i>=1;i--)printf("%04d",no.a[i]); printf("\n"); } void chenfa_x(node &no, int x) { for(int i=1;i<=no.len;i++)no.a[i]*=x; for(int i=1;i<=no.len;i++)if(no.a[i]>Base) { no.a[i+1]+=no.a[i]/Base; no.a[i]%=Base; } int i=no.len; while(no.a[i+1]>0) { i++; no.a[i+1]+=no.a[i]/Base; no.a[i]%=Base; } no.len=i; } int main() { node n1=Init(); node n2=Init(); int T=0;Gcd(n1,n2,T); if(T==0)Print(n1); else { for(int i=1;i<=T;i++)chenfa_x(n1, 2); Print(n1); } return 0; }
- 1
信息
- ID
- 3541
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 7
- 标签
- 递交数
- 45
- 已通过
- 11
- 上传者