문제 설명
음이 아닌 정수로 이루어진 배열
정수
- 서로 다른 배열의 인덱스
개를 선택한다. 를 계산한다.- 각
에 를 뺀다. 그리고 나머지 원소들은 그대로 둔다.
배열
먼저
Input
첫번째 줄에는 테스트 케이스의 개수를 나타내는 정수
각 테스트케이스의 첫번째 줄에는 배열
각 테스트케이스의 두번째 줄에는 배열
Output
각 테스트케이스마다 가능한 모든
Example
input
5
4
4 4 4 4
4
13 7 25 19
6
3 5 3 1 7 1
1
1
5
0 0 0 0 0
output
1 2 4
1 2
1
1
1 2 3 4 5
문제 접근
사용한 알고리즘: 비트마스크, 정수론, 수학
걸린 시간 : 00:06
virtual contest에서 2번 문제에 시간을 많이 쓰지 않았다면 실전에서 풀 수 있을 것 같은 자신감을 가진 문제이다. 실제로 대회가 끝나고 30분정도 시간을 써서 문제를 풀어봤는데 문제에서 요구하는 정해에 완전 근접한 방법에 도달했다. 이렇게 내가 발전하는 것일까? 진짜진짜 rating 1200대의 벽을 뚫고 싶다. 진짜.
일단 문제 조건에
배열
- 01101
- 00111
- 11001
- 10011
이고, 만약 25와 19를 선택하면 다음과 같이 된다.
- 01101
- 00111
- 01000
- 00010
25와 19에서 같은 자리에 1이 모두 있는 경우 그 1만 사라지는 것을 볼 수 있다. 즉 원소를
같은 줄에 있는 1의 개수만큼
이
혹은
정답 코드
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin >> t;
while(t--){
int n; cin >> n;
int arr[n];
for(int i = 0; i < n; i++) cin >> arr[i];
int cnt[31] = {};
for(int i = 0; i <= 30; i++){
for(int j = 0; j < n; j++) cnt[i] += (arr[j] & (1 << i) ? 1 : 0);
}
for(int i = 1; i <= n; i++){
bool flag = true;
for(int j = 0; j <= 30; j++){
if(cnt[j] % i != 0) flag = false;
}
if(flag) cout << i << " ";
}
cout << "\n";
}
return 0;
}
'알고리즘 > codeforces' 카테고리의 다른 글
Codeforces Round #748 (Div. 3)-C. Save More Mice (0) | 2021.11.24 |
---|---|
Codeforces Round #748 (Div. 3)-A. Elections (0) | 2021.11.24 |
Codeforces Round #751 (Div. 2)-A. Two Subsequences (0) | 2021.11.20 |
Codeforces Round #745 (Div. 2)-C. Portal (0) | 2021.11.16 |
Codeforces Round #745 (Div. 2)-B. Diameter of Graph (0) | 2021.11.16 |