碎碎念
- 一个字:爽;两个字:好爽;三个字:特别爽。这是迄今为止做的最爽的一道题。
- 老码农:爽你个大头鬼,老做爽题,你的水平就会停滞不前
ABC144-C-01
标签
- 数学、约数分解
题目地址
- C - Walk on Multiplication Table
- https://atcoder.jp/contests/abc144/tasks/abc144_c
题目描述
Problem Statement
Takahashi is standing on a multiplication table with infinitely many rows and columns.
The square (i,j) contains the integer i
j. Initially, Takahashi is standing at (1,1).
In one move, he can move from (i,j) to either (i 1,j) or (i,j 1).
Given an integer N, find the minimum number of moves needed to reach a square that contains N.
Constraints
- 2 leq N leq 10^{12}
- N is an integer.
Input
Input is given from Standard Input in the following format:
代码语言:javascript复制N
Output
Print the minimum number of moves needed to reach a square that contains the integer N.
Sample Input 1
代码语言:javascript复制10
Sample Output 1
代码语言:javascript复制5
(2,5) can be reached in five moves. We cannot reach a square that contains 10 in less than five moves.
Sample Input 2
代码语言:javascript复制50
Sample Output 2
代码语言:javascript复制13
(5, 10) can be reached in 13 moves.
Sample Input 3
代码语言:javascript复制10000000019
Sample Output 3
代码语言:javascript复制10000000018
Both input and output may be enormous.
题解
小码匠题解
代码语言:javascript复制void coder_solution() {
// 提升cin、cout效率
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
long long n;
cin >> n;
for(long long i = sqrt(n); i > 0; --i) {
if(n % i == 0) {
cout << i - 1 (n / i) - 1;
return;
}
}
}
参考题解
代码语言:javascript复制#include <bits/stdc .h>
using namespace std;
int main() {
long long N;
cin >> N;
long long res = N 1 - 2; // (a, b) = (1, N)
for (long long a = 1; a * a <= N; a) {
if (N % a == 0) res = min(res, a N/a - 2);
}
cout << res << endl;
}