萌新求助数论
查看原帖
萌新求助数论
726098
hytallenxu楼主2024/7/3 11:35

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 的算法。

请问我这种算法属于什么类型?时间复杂度如何证明呢?

如讨论区题解则麻烦告知紫衫,勿喷

2024/7/3 11:35
加载中...