Koala - 11기/코딩테스트 준비 스터디

[백준/C++] 23827 수열(Easy)

nunomi0 2023. 8. 6. 16:10

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

 

23827번: 수열 (Easy)

모든 원소가 양의 정수이고, 길이가 $N$인 수열 $A_1, A_2, ..., A_N$이 주어진다. $1 \le i < j \le N$을 만족하는 모든 정수쌍 $(i, j)$에 대해 $A_i \times A_j$의 합을 $1\, 000 \, 000 \, 007$로 나눈 나머지를 구하시

www.acmicpc.net

 

# 문제 설명

- 모든 원소가 양의 정수이고, 길이가 N인 수열 A1, A2, ... , AN이 주어진다. 1<=i<j<=N을 만족하는 모든 정수쌍 (i,j)에 대해 Ai*Aj의 합을 1 000 000 007로 나눈 나머지를 구한다.

- 첫째 줄에 수열 A의 길이 N이 주어진다. (2<=N<=500000)

- 둘째 줄에 수열 A1, A2, ... , AN이 공백으로 구분되어 주어진다. (1<=Ai<=500000, 1<=i<=N)

 

# 풀이 방법

- 곱의 분배 법칙을 이용하여 a1*a2+a2*a3+a1*a3 을 a1*0+a2*a1+a3*(a1+a2) 형태로 바꾼다.

- 누적합을 이용하여 시간초과를 방지한다.

 

# 정답 코드

#include <iostream>
using namespace std;

long long n;
long long arr[500010];
long long ps[500010];
long long ans = 0;


int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> arr[i];
		ps[i] = ps[i - 1] + arr[i];
		ans += arr[i] * ps[i - 1];
		ans %= 1000000007;
	}
	cout << ans;
}