AT5266 [ABC144C] Walk on Multiplication Table 题解

题意简述


给定一个平面直角坐标系和一个整数 nn,你在 (1,1)(1,1),且每次都能向上或向左移动一格。

求你到达 (x,y)(xy=n)(x,y)(x \cdot y = n) 所要的次数。

解题思路


注意起点是 (1,1)(1,1)

无论如何走,步数都是 (x1)+(y1)(x-1)+(y-1)x+y2x+y-2

又因为 xy=nx \cdot y = n

所以 x,yx,y 都是 nn 的因数。

所以从 1n1 \to \sqrt{n} 枚举 nn 的因数即可,时间复杂度 Θ(n)\Theta (\sqrt{n})

要开 long long

代码实现


#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
ll n,ans=inf;
int main() {
	scanf("%lld",&n);
	for(int i=1;i<=sqrt(n);i++)
		if(n%i==0) ans=min(n/i+i-2,ans);
	printf("%lld",ans);
	return 0;
}
//code by _IcyFire