社区讨论
TLE求条
P2152[SDOI2009] SuperGCD参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mj56gu8p
- 此快照首次捕获于
- 2025/12/14 11:41 3 个月前
- 此快照最后确认于
- 2025/12/16 21:35 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
struct gj{
string a;
operator string()const{
return a;
}
gj&operator=(const string& s){
a=s;
return *this;
}
};
istream& operator>>(istream& in, gj& obj){
in >> obj.a;
return in;
}
ostream& operator<<(ostream& out, const gj& obj){
out << obj.a;
return out;
}
gj operator+ (gj x,gj y){
string xx=x;
string yy=y;
if(xx.size()>yy.size()){
string t=xx;
xx=yy;
yy=t;
}
int s=xx.size();
int ss=yy.size();
for(int i=0;i<s;i++){
yy[i]+=xx[i]-'0';
if(yy[i]>'9'){
if(i==ss-1){
yy+='1';
}
else{
yy[i+1]++;
}
yy[i]-=10;
}
}
for(int i=s;i<ss;i++){
if(yy[i]>'9'){
yy[i]-=10;
if(i==ss-1){
yy+='1';
}
else{
yy[i+1]++;
}
}
}
return {yy};
}
gj operator- (gj x,gj y){
string xx=x;
string yy=y;
string t=xx;
xx=yy;
yy=t;
int s=xx.size();
int ss=yy.size();
for(int i=0;i<s;i++){
yy[i]-=xx[i]-'0';
if(yy[i]<'0'){
yy[i+1]--;
yy[i]+=10;
}
}
for(int i=s;i<ss;i++){
if(yy[i]<'0'){
yy[i]+=10;
yy[i+1]--;
}
}
int sum=0;
for(int i=ss-1;i>0;i--){
if(yy[i]=='0'){
sum++;
}
else{
break;
}
}
yy.erase(ss-sum,sum);
return {yy};
}
gj operator* (gj x,gj y){
vector<int> ans(string(x).size()+string(y).size());
string xx=x;
string yy=y;
int s=xx.size();
int ss=yy.size();
for(int i=0;i<s;i++){
for(int j=0;j<ss;j++){
ans[i+j]+=(xx[i]-'0')*(yy[j]-'0');
}
}
for(int i=0;i<s+ss;i++){
if(ans[i]>=10){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
}
string anss="";
for(int i=0;i<s+ss;i++){
if(i==s+ss-1&&ans[i]==0){
break;
}
else{
anss+=ans[i]+'0';
}
}
int sum=0;
int nn=anss.size();
for(int i=nn-1;i>0;i--){
if(anss[i]=='0'){
sum++;
}
else{
break;
}
}
anss.erase(nn-sum,sum);
return {anss};
}
bool operator<=(gj x,gj y){
string xx=x;
string yy=y;
if(xx.size()!=yy.size()){
return xx.size()<yy.size();
}
int n=xx.size();
for(int i=n-1;i>=0;i--){
if(xx[i]!=yy[i]){
return xx[i]<=yy[i];
}
}
return 1;
}
bool operator<(gj x,gj y){
string xx=x;
string yy=y;
if(xx.size()!=yy.size()){
return xx.size()<yy.size();
}
int n=xx.size();
for(int i=n-1;i>=0;i--){
if(xx[i]!=yy[i]){
return xx[i]<yy[i];
}
}
return 0;
}
bool me(gj x){
string a=x;
if((a[0]-'0')%2==0){
return 1;
}
else{
return 0;
}
}
gj ce(gj x){
string a=x;
int n=a.size();
int y=0;
for(int i=n-1;i>=0;i--){
int num=a[i]-'0';
num+=y*10;
y=num%2;
num/=2;
a[i]=num+'0';
}
int sum=0;
for(int i=n-1;i>0;i--){
if(a[i]=='0'){
sum++;
}
else{
break;
}
}
a.erase(n-sum,sum);
return {a};
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
gj a,b;
cin>>a>>b;
gj a1={"1"};
gj ans={"1"};
gj t;
string aa=a;
string bb=b;
reverse(aa.begin(),aa.end());
reverse(bb.begin(),bb.end());
a={aa};
b={bb};
while(me(a)&&me(b)){
a=ce(a);
b=ce(b);
ans=ans+ans;
}
while(me(a)){
a=ce(a);
}
while(me(b)){
b=ce(b);
}
if(a<b){
gj t=a;
a=b;
b=t;
}
while(1){
a=a-b;
while(me(a)&&a1<=a){
a=ce(a);
}
if(a<b){
gj t=a;
a=b;
b=t;
}
if(b<a1){
break;
}
}
gj anss=a*ans;
string ansss=anss;
reverse(ansss.begin(),ansss.end());
cout<<ansss;
}
就是一堆重载函数+Stein算法
回复
共 1 条回复,欢迎继续交流。
正在加载回复...