BOJ 28294 - 프랙탈
각 단계마다 그 다음단계에서 비워지는 지워지는 부분을 제거하고 생각해보자.
처음에 길이는 개가 개 있으므로 지만 그 다음 단계에서 이 한 변마다 없어지므로
이 더해진다고 생각할 수 있다.
그 다음 단계는 개의 변이 생기는데 똑같이 가 곱해져서
이다.
똑같이 그 다음단계는 이다.
근데 이 식을 잘 정리하면
이여서 결국 등비수열의 합공시인 이므로 이고 인것으로 생각하면
식을 잘 정리해서 분할정복을 이용한 거듭제곱을 쓰면 된다.
그런데 마지막 항은 이 될 수 없으므로 만 사용해주는 방식으로 다시 를 더해주는 방식으로 답을 구해주자.
const ll mod = 1e9 + 7;
inline ll md(ll x) { return md(mod, x); }
inline ll poww(ll a, ll b) {
ll ret = 1;
while (b) {
if (b & 1) {
ret *= a;
if (~mod) ret %= mod;
}
a *= a;
if (~mod) a %= mod;
b >>= 1;
}
return ret;
}
void solve() {
int n, a;
cin >> n >> a;
int ans = md(poww(n, a + 1) * (n - 1));
ans = md(ans - n * poww(n - 1, a + 1));
ans = md(ans + n * poww(n - 1, a));
cout << ans;
}
Comments