작성일 :

문제 링크

3554번 - Enigmatic Device

설명

수열에 대해 두 가지 연산을 수행하는 문제입니다.

첫 번째 연산은 주어진 구간의 각 원소를 제곱하고 2010으로 나눈 나머지로 갱신하는 것이고, 두 번째 연산은 주어진 구간의 합을 출력하는 것입니다.


접근법

수열의 길이 n과 초기 수열을 입력받은 후, 각 연산의 종류에 따라 처리합니다.

연산 종류가 1이면 구간 내 모든 원소에 대해 제곱 후 2010으로 나눈 나머지를 저장합니다. 연산 종류가 2이면 구간 내 모든 원소의 합을 계산하여 출력합니다.


Code

C#

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
using System;
using System.Text;

class Program {
  static void Main() {
    var n = int.Parse(Console.ReadLine()!);

    var a = Array.ConvertAll(Console.ReadLine()!.Split(), int.Parse);

    var m = int.Parse(Console.ReadLine()!);

    var sb = new StringBuilder();
    for (var i = 0; i < m; i++) {
      var query = Console.ReadLine()!.Split();
      var kind = int.Parse(query[0]);
      var l = int.Parse(query[1]) - 1;
      var r = int.Parse(query[2]) - 1;

      if (kind == 1) {
        for (var j = l; j <= r; j++)
          a[j] = (a[j] * a[j]) % 2010;
      } else {
        var sum = 0L;
        for (var j = l; j <= r; j++)
          sum += a[j];
        sb.AppendLine(sum.ToString());
      }
    }

    Console.Write(sb);
  }
}

C++

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef vector<int> vi;

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int n; cin >> n;

  vi a(n);
  for (int i = 0; i < n; i++)
    cin >> a[i];

  int m; cin >> m;

  for (int i = 0; i < m; i++) {
    int kind, l, r;
    cin >> kind >> l >> r;
    l--; r--;

    if (kind == 1) {
      for (int j = l; j <= r; j++)
        a[j] = (a[j] * a[j]) % 2010;
    } else {
      ll sum = 0;
      for (int j = l; j <= r; j++)
        sum += a[j];
      cout << sum << "\n";
    }
  }

  return 0;
}