疑问
查看原帖
疑问
645641
cdx123456楼主2023/10/26 15:14

大致思路是直接枚举a,b

但因为a,b过大所以把R(h,1)往回推,退出来一些小性质,然后再枚举,性质详见代码

不太清楚此做法的正确性及复杂度,有没有神仙分析一下或给组hack

附式子过程

R(h,1)=R(1,h)=R(hk∼2hk−1,h)R(h,1)=R(1,h)=R(h^k\sim 2h^k-1,h)

枚举k,在hk∼2hk−1h^k\sim 2h^k-1中枚举g∗xg*x

R(g∗x,h)=R(h,g∗x)=R(h∗(g∗x)k∼(h+1)∗(g∗x)k,h)R(g*x,h)=R(h,g*x)=R(h*(g*x)^k\sim(h+1)*(g*x)^k,h)

再盲猜有k=1k=1符合条件

于是在h∗g∗x∼(h+1)∗g∗xh*g*x\sim(h+1)*g*x中枚举g∗yg*y,要求x,yx,y互质

看起来这个做法就很假的样子,不过评测记录

#include<bits/stdc++.h>
using namespace std;
#define int long long
int gcd(int x,int y){
	if(!y) return x;
	return gcd(y,x%y);
}
signed main(){
	int T;
	cin>>T;
	while(T--){
		int x=1,g,h;
		cin>>g>>h;
		for(int k=1;;k++){
			x*=h;
			int l=(int)ceil(x*1.0/g),r=2*x/g,f=0;
			if(l>=r) continue;
			for(int j=l;j<r;j++){
				for(int k=0;k<j;k++){
					int y=h*j+k;
					if(gcd(j,y)==1){
						cout<<g*j<<' '<<g*y<<endl;
						f=1;
						break;
					}
				}
				if(f) break;
			}
			if(f) break;
		} 	
	}
	return 0;
}
2023/10/26 15:14
加载中...