rt,我在阅读《初等数论》后写出了如下的代码
#include <bits/stdc++.h>
#define int long long
#define mp make_pair
#define pb push_back
using namespace std;
using i64 = long long;
int n,t,cnt=1;
int q[40],p[40],Q[40];
pair<int,int> ans;
void divi(int x, int y){
while(x>1 && y>1){
int f=(x/y)*y;
q[cnt++]=x/y;
x-=f;
swap(x,y);
}
}
pair<int, int> solve2(int a, int b, int c){
divi(a,b);
if(a==1){
auto ans=mp(c,0);
return ans;
}
if(b==1){
auto ans=mp(0,c);
return ans;
}
p[0]=1;p[1]=q[1];
for(int i=2;i<cnt;i++) p[i]=q[i]*p[i-1]+p[i-2];
Q[0]=0;Q[1]=1;
for(int i=2;i<cnt;i++) Q[i]=q[i]*Q[i-1]+Q[i-2];
int x=((cnt-2)%2?-1:1)*Q[cnt-1],y=((cnt-1)%2?-1:1)*p[cnt-1];
auto ans=mp(x*c,y*c);
return ans;
}
void solve(){
for(int i=0;i<cnt;i++) p[i]=q[i]=Q[i]=0;
cnt=1;
int a,b,c;
cin>>a>>b>>c;
int gcd=__gcd(abs(a),abs(b));
if(c%gcd!=0){cout<<"-1\n"; return;}
if(gcd!=1){
a/=gcd,b/=gcd,c/=gcd;
int absa=abs(a),absb=abs(b),absc=abs(c);
ans=solve2(absa,absb,absc);
}else{
ans=solve2(a,b,c);
}
int x0=ans.first,y0=ans.second;
if(a<0) x0=-x0;
if(b<0) y0=-y0;
//cout<<x0<<" "<<y0<<"()\n";
int minx=x0%b,miny=y0%a;
minx=(minx<=0?minx+b:minx);
miny=(miny<=0?miny+a:miny);
int maxx=(c-b*miny)/a, maxy=(c-a*minx)/b;
if(maxx<=0 || maxy<=0){
cout<<(c-b*maxy)/a<<" "<<(c-a*maxx)/b<<endl;
return;
}
cout<<(maxx-minx)/b+1<<" "<<minx<<" "<<miny<<" "<<maxx<<" "<<maxy<<endl;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(nullptr);cout.tie(nullptr);
cin>>t;
while(t--) solve();
// 解的数量 = min((c/a-最小x)/b+1, (c/b-最小y)/a+1)
return 0;
}
其中并没有使用到 exgcd 的算法。
请问我这种算法属于什么类型?时间复杂度如何证明呢?
如讨论区题解则麻烦告知紫衫,勿喷