이 튜토리얼에서는 1부터 n까지의 자연수가 두 개의 반으로 나뉘는지 여부를 찾아야 합니다. 다음 조건을 만족해야 합니다.
-
두 시리즈 합계의 절대 차이는 m이어야 합니다.
-
그리고 두 합의 GCD는 1이어야 합니다. 즉, 공소수입니다.
처음 n개의 자연수의 합은 (n*(n+1))/2입니다. 총합과 차 m이 있으므로 sumOne과 sumTwo를 찾을 수 있습니다. 아래 방정식을 참조하십시오.
sumOne + sumTwo = (n*(n+1))/2 sumOne - sumTwo = m
예시
절대 합이 m과 같은지 확인하십시오. 그런 다음 GCD를 확인합니다.
#include <bits/stdc++.h>
using namespace std;
bool canSplitIntoTwoHalves(int n, int m) {
int total_sum = (n * (n + 1)) / 2;
int sumOne = (total_sum + m) / 2;
int sumTwo = total_sum - sumOne;
if (total_sum < m) {
return false;
}
if (sumOne + sumTwo == total_sum &&sumOne - sumTwo == m) {
return (__gcd(sumOne, sumTwo) == 1);
}
return false;
}
int main() {
int n = 10, m = 17;
if (canSplitIntoTwoHalves(n, m)) {
cout << "Can split";
}
else {
cout << "Can't split";
}
return 0;
} 출력
위의 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Can split
결론
튜토리얼에서 질문이 있는 경우 댓글 섹션에 언급하세요.