BOJ
[BOJ 2737 // C++] 연속 합
measurezero
2024. 1. 5. 10:00
※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2737번 문제인 연속 합이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2737
2737번: 연속 합
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 정수 하나로 이루어져 있다. 이 정수는 문제에서 설명한 N이며, 231보다 작다.
www.acmicpc.net
\(k\)개의 연속한 양의 정수 \(N, N+1, ..., N+(k-1)\)의 합은 \(kN + k(k-1)/2\) 와 같이 나타낼 수 있다.
따라서 어떤 양의 정수가 \(k\)개의 연속한 양의 정수의 합으로 나타낼 수 있는지의 여부는 해당 정수에서 \(k(k-1)/2\)를 뺀 수가 양수이면서 \(k\)의 배수인지 확인하는 것으로 알아낼 수 있다.
글쓴이는 테스트케이스가 10000개 이하일 것이라 가정하고 아래와 같이 코드를 작성하였다.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int T;
ll arr[10001];
int cnt[10001];
ll psum;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
for (int t = 0; t < T; t++) cin >> arr[t];
for (ll i = 2; psum < 2147483648LL; i++) {
psum += i - 1;
for (int t = 0; t < T; t++) {
ll tmp = arr[t] - psum;
if (tmp <= 0 || tmp % i) continue;
cnt[t]++;
}
}
for (int t = 0; t < T; t++) cout << cnt[t] << '\n';
}
728x90