社区讨论
20分TLE,已崩溃,求调(上面绿,下面有一个1.12s)
P2152[SDOI2009] SuperGCD参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mjf3b733
- 此快照首次捕获于
- 2025/12/21 10:10 2 个月前
- 此快照最后确认于
- 2025/12/23 16:50 2 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
struct BigIht{
vector<int> d;
BigIht(){}
BigIht(const string&s){
for(int i=s.size()-1;i>=0;--i){
d.push_back(s[i]-'0');
}
}
BigIht(int x){
if(x==0){
d.push_back(0);
return ;
}
while(x>0){
d.push_back(x%10);
x/=10;
}
}
friend BigIht operator+(const BigIht& aa,const BigIht&bb){
BigIht res;
const vector<int>&a=aa.d;
const vector<int>&b=bb.d;
vector<int>& c=res.d;
int len_a=a.size(),len_b=b.size();
int len=max(len_a,len_b);
c.resize(len+1,0);
for(int i=0;i<len;++i){
if(i<len_a)c[i]+=a[i];if(i<len_b)c[i]+=b[i];
c[i+1]+=c[i]/10;
c[i]%=10;
}
while(c.size()>1&&c.back()==0)c.pop_back();
return res;
}
friend BigIht operator-(const BigIht& aa,const BigIht&bb){
BigIht res;
const vector<int>&a=aa.d;
const vector<int>&b=bb.d;
vector<int>& c=res.d;
int len_a=a.size(),len_b=b.size();
int len=max(len_a,len_b);
c.resize(len+1,0);
for(int i=0;i<len;++i){
if(i<len_a)c[i]+=a[i];if(i<len_b)c[i]-=b[i];
while(c[i]<0){
c[i]+=10;
c[i+1]--;
}
c[i]%=10;
}
while(c.size()>1&&c.back()==0)c.pop_back();
return res;
}
friend BigIht operator*(const BigIht& aa,const BigIht&bb){
BigIht res;
const vector<int>&a=aa.d;
const vector<int>&b=bb.d;
vector<int>& c=res.d;
c.resize(a.size()+b.size()+1,0);
for(int i=0;i<a.size();++i){
for(int j=0;j<b.size();++j){
c[i+j]+=a[i]*b[j];
}
}
for(int i=0;i<=a.size()+b.size();++i){
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
while(c.size()>1&&c.back()==0)c.pop_back();
return res;
}
void div2() {
int sum=0;
for(int i=d.size()-1;i>=0;--i) {
int cur=d[i]+sum*10;
d[i]=cur/2;
sum=cur%2;
}
while(d.size()>1&&d.back()==0)d.pop_back();
}
void cheng2(){
int carry=0;
for(int i=0;i<d.size();++i) {
int p=d[i]*2+carry;
d[i]=p%10;
carry=p/10;
}
if(carry>0) {
d.push_back(carry);
}
}
friend BigIht operator/(const BigIht& aa,const int&bb){
BigIht res;
const vector<int>&a=aa.d;
int sum=bb;
vector<int>& c=res.d;
int len_a=a.size();
c.resize(len_a,0);
int ans=0;
for(int i=len_a-1;i>=0;--i){
ans*=10;
ans+=a[i];
c[i]=ans/sum;
ans%=sum;
}
while(c.size()>1&&c.back()==0)c.pop_back();
return res;
}
friend ostream& operator<<(ostream& os,const BigIht& a){
for(int i=a.d.size()-1;i>=0;--i)os<<a.d[i];
return os;
}
friend bool operator<(const BigIht& aa,const BigIht& bb){
const vector<int>&a=aa.d;
const vector<int>&b=bb.d;
if(aa.d.size()!=bb.d.size())return aa.d.size()<bb.d.size();
for(int i=a.size()-1;i>=0;--i){
if(a[i]!=b[i])return a[i]<b[i];
}
return 1;
}
friend bool operator>(const BigIht& aa,const BigIht& bb){
const vector<int>&a=aa.d;
const vector<int>&b=bb.d;
if(aa.d.size()!=bb.d.size())return aa.d.size()>bb.d.size();
for(int i=a.size()-1;i>=0;--i){
if(a[i]!=b[i])return a[i]>b[i];
}
return 1;
}
friend bool operator==(const BigIht& aa,const BigIht& bb){
const vector<int>&a=aa.d;
const vector<int>&b=bb.d;
return a==b;
}
};
signed main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
string aa,bb;
cin>>aa>>bb;
BigIht a,b;
BigIht k=1;
a=aa,b=bb;
while(a.d[0]%2==0&&b.d[0]%2==0) {
a.div2();
b.div2();
k=k*2;
}
while(!(b==0)){
if(a.d[0]%2==0&&b.d[0]%2==1){
a.div2();
}
else if(a.d[0]%2==1&&b.d[0]%2==0){
b.div2();
}else if(a.d[0]%2==0&&b.d[0]%2==0){
k.cheng2();
a.div2();b.div2();
}else{
if(a<b){
b=b-a;
}else{
BigIht t=b;
b=a-b;
a=t;
}
}
}
cout<<a*k;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...