BOJ 10370 - Ball
BOJ 28261 와 비슷한 이항계수 조합론 문제이다.
로 나타내면 한 턴이 지난 후에 이 된다.
이 꼴이 이항계수처럼 나오는데,
한 턴이 지나면 번째 자리가 이 되고,
두턴이 지나면 가 되고 세턴이 지나면
이 된다.
그런데 우린 으로 나눈 나머지가 필요하므로 이 된다.
이항계수 에서 이 의 거듭제곱 수일 때, 항상 을 제외하고 모두 의 배수이다.
여서 항상 에 이 하나이상 남기 때문이다. 분모에서 의 거듭제곱 지수가 분자에있는 것보다 이상이 될 수 없다.
따라서 인 를 계속 골라가며 을 진행하고 에서 를 빼는것을 반복한다.
이 횟수는 이 걸리고 문제를 에 해결할 수 있다.
const ll mod = 3;
inline ll md(ll x) { return md(mod, x); }
int idx(char c) {
return c == 'W' ? 0 : c == 'R' ? 1 : 2;
}
char ch(int i) {
return i == 0 ? 'W' : i == 1 ? 'R' : 'G';
}
void solve() {
string s;
cin >> s;
int m = sz(s), n;
cin >> n;
vi cnt(3);
int k = 1;
while (k * 3 <= n) k *= 3;
vi a(m);
for (int i = 0; i < m; i++) a[i] = idx(s[i]);
while (n) {
int q = n / k;
while (q--) {
vi b = a;
for (int i = 0; i < m; i++) {
b[i] = (a[i] + a[md(m, i + k)]) % 3;
}
a = b;
n -= k;
}
k /= 3;
}
for (int i = 0; i < m; i++) cnt[a[i]]++;
for (int i: cnt) cout << i << ' ';
cout << endl;
}
Comments