※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 2737번 문제인 연속 합이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/2737 

 

2737번: 연속 합

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 정수 하나로 이루어져 있다. 이 정수는 문제에서 설명한 N이며, 231보다 작다.

www.acmicpc.net

k개의 연속한 양의 정수 N,N+1,...,N+(k1)의 합은 kN+k(k1)/2 와 같이 나타낼 수 있다.

 

따라서 어떤 양의 정수가 k개의 연속한 양의 정수의 합으로 나타낼 수 있는지의 여부는 해당 정수에서 k(k1)/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

'BOJ' 카테고리의 다른 글

[BOJ 9471 // C++] 피사노 주기  (0) 2024.01.07
[BOJ 2799 // C++] 블라인드  (1) 2024.01.06
[BOJ 7117 // C++] Sevens, twos and zeros  (0) 2024.01.04
[BOJ 1750 // C++] 서로소의 개수  (1) 2024.01.03
[BOJ 2436 // C++] 공약수  (1) 2024.01.02

+ Recent posts