이 튜토리얼에서는 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
결론
튜토리얼에서 질문이 있는 경우 댓글 섹션에 언급하세요.