1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[AtCoder] 競プロ典型 90問 046 - I Love 46

Posted at

46って出題者はおひさまなんでしょうか。
影山優佳さんサッカー詳しくていいですよね。
問題ですが、3つの整数の和が46の倍数ということは、
3つの整数それぞれの46の剰余の和も46の倍数である必要があります。
ここで3つの整数 $0 \le l,m,n \le 45$ があり、 $l+m+n$ が46の倍数であるとき、
$A_{i} = l, B_{j} = m, C_{k} = n$ となる整数の個数をそれぞれ $\acute{A_{l}}, \acute{B_{m}}, \acute{C_{n}}$ とすると、
選び方は $\acute{A_{l}} \times \acute{B_{m}} \times \acute{C_{n}}$ となります。
その計算をソースコードに落とし込んだのが以下です。
言語はC++(GCC 9.2.1)でAtCoderのコードテストで確認しています。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

int main() {
  ll N, a;
  vector<ll> A(46, 0), B(46, 0), C(46, 0);
  cin >> N;
  for (int i = 0; i < N; i++) {
    cin >> a;
    A[a % 46]++;
  }
  for (int i = 0; i < N; i++) {
    cin >> a;
    B[a % 46]++;
  }
  for (int i = 0; i < N; i++) {
    cin >> a;
    C[a % 46]++;
  }

  ll ans = 0;
  for (int i = 0; i < 46; i++) {
    if (!A[i]) continue;
    for (int j = 0; j < 46; j++) {
      if (!B[j]) continue;
      for (int k = 0; k < 46; k++) {
        if (!C[k]) continue;
        if ((i + j + k) % 46 > 0) continue;
        ans += A[i] * B[j] * C[k];
      }
    }
  }
  
  cout << ans << endl;
}
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?