求助昨晚ARC的B题复杂度错误
  • 板块学术版
  • 楼主Caiest_Oier
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/4/9 09:54
  • 上次更新2023/10/23 18:58:53
查看原帖
求助昨晚ARC的B题复杂度错误
932169
Caiest_Oier楼主2023/4/9 09:54

这是本人的代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a,b,ans,k1,k2,k3,k4,k5,k6;
void dfs(int X,int Y){
	if(X<1)return;
	if(X==Y){
		ans+=X;
		k1=X;
		return;
	}
	k1=__gcd(X,Y);
	X/=k1;
	Y/=k1;
	k3=Y-X;
	k4=k3;
	k5=0;
	for(int i=1;i*i<=k3;i++){
		if(k3%i!=0)continue;
		k5++;
		if(i!=1&&X%i>0)k4=min(k4,X%i);
		if(X%(k3/i))k4=min(k4,X%(k3/i));
		if(k4==1)break;
	}
	ans+=k4;
	dfs(X-k4,Y-k4);
	return;
}
signed main(){
	scanf("%lld%lld",&a,&b);
	k1=__gcd(a,b);
	a/=k1;
	b/=k1;
	if(a==b){
		puts("1");
		return 0;
	}
	if(a>b)swap(a,b);
	dfs(a,b);
	printf("%lld",ans);
	return 0;
}

大致思路是每次把两个数的gcd除掉,然后枚举两数之差的因数,来算离二者最近的公约数在哪里,然后减掉。按理来讲gcd每次>=2,复杂度应该不超过Θ(log⁡n×n)\Theta(\log n\times \sqrt{n}) 才对,但是33AC,8TLE

2023/4/9 09:54
加载中...