- 分享
90WA求调
- 2025-5-20 19:23:46 @
问题:
Wrong Answer 0 Your sequence is longer than the standard answer!QAQ
代码:
#include<bits/stdc++.h>
using namespace std;
bool flag=false;
long long ans[10000];
long long num[10000];
long long deep;
long long maxi;
long long minlo=1000;
long long gcd(long long a,long long b){
return b==0?a:gcd(b,a%b);
}
struct fs{
long long fz,fm;
fs operator-(const fs x)const{
long long g=gcd(fm,x.fm);
long long new_fm=fm/g*x.fm;
long long new_fz=fz*(new_fm/fm)-x.fz*(new_fm/x.fm);
if(new_fz<=0)return{0,1};
long long g2=gcd(new_fz,new_fm);
return {new_fz/g2, new_fm/g2};
}
};
void dfs(long long lev,fs f){
if(lev>deep)return;
if(f.fz==1&&f.fm>num[lev-1]&&f.fm<=1e7){
num[lev]=f.fm;
if(!flag||num[lev]<ans[lev]){
for(long long i=1;i<=lev;i++)ans[i]=num[i];
flag=true;
}
return;
}if(lev==deep){
if(f.fz!=1||f.fm>1e7)return;
if(!flag||num[lev]<ans[lev]){
for(long long i=1;i<=lev;i++)ans[i]=num[i];
flag=true;
}return;
}
if(lev==deep-1){
long long l=(f.fm<<2)/f.fz/f.fz+((f.fm<<2)%(f.fz*f.fz)!=0);
long long maxbb=min(min((long long)(2e7/f.fz),(long long)(2e14/f.fm)),(long long)(1e7));
long long r=min((maxbb<<1)/f.fz,maxbb*(maxbb-1)/f.fm);
for (int k=l;k <=r;k++){
long long delta=f.fz*f.fz*k*k-(f.fm<<2)*k;
if(delta<=0)continue;
long long d=sqrt(delta);
if(d*d!=delta||(f.fz*k+d)&1)continue;
long long x1=(f.fz*k-d)>>1;
if(x1<=num[lev-1]||x1>1e7)continue;
long long x2=(f.fz*k+d)>>1;
if(x2<=0||x1<=0||x2>1e7)continue;
if(flag&&x2>=ans[deep])break;
if(((!ans[lev]||x2<ans[deep])&&x1>num[lev-1]&&x2>x1&&deep<=minlo)&&deep<=minlo){
num[deep-1]=x1,num[deep]=x2;
for(int i=1;i<=deep;i++)ans[i]=num[i];
minlo=deep;
flag=true;
return;
}
}
return;
}
long long l=max(num[lev-1]+1,(f.fm+f.fz-1)/f.fz);
long long r=min((long long)(1e7),(deep-lev+1)*f.fm/f.fz);
if(flag)r=min(r,ans[deep]-1);
for(long long i=l;i<=r;i++){
fs n_fs=f-(fs){1,i};
if(n_fs.fz<=0)continue;
num[lev]=i;
dfs(lev+1,n_fs);
}
}
int main(){
long long a,b;
scanf("%lld %lld",&a,&b);
maxi=b*1e7;
fs f={a,b};
deep=1;
while(deep<100){
dfs(1,f);
if(ans[deep]>1e7)flag=false;
if(flag){
for(int i=1;i<=deep;i++)cout<<ans[i]<<" ";
return 0;
}
++deep,flag=false;
}
return 0;
}
0 comments
No comments so far...