BOJ 28294 - 프랙탈

image.png

각 단계마다 그 다음단계에서 비워지는 지워지는 부분을 제거하고 생각해보자.

처음에 길이는 nan^a 개가 nn개 있으므로 nnan \cdot n^a 지만 그 다음 단계에서 na1n^{a-1} 이 한 변마다 없어지므로

n(nana1)n \cdot (n^a-n^{a-1}) 이 더해진다고 생각할 수 있다.

그 다음 단계는 n(n1)n(n-1) 개의 변이 생기는데 똑같이 (na1na2)(n^{a-1}-n^{a-2}) 가 곱해져서

n(n1)(na1na2)n(n-1)(n^{a-1}-n^{a-2}) 이다.

똑같이 그 다음단계는 n(n1)2(na2na3)n(n-1)^2(n^{a-2}-n^{a-3}) 이다.

근데 이 식을 잘 정리하면

na(n1)na1(n1)2na2(n1)3 \begin{aligned} n^a(n-1) \\ n^{a-1}(n-1)^2 \\ n^{a-2}(n-1)^3 \\ \vdots \end{aligned}

이여서 결국 등비수열의 합공시인 s=a1(1rn)1rs=\dfrac{a_1\left( 1-r^n \right)}{1-r} 이므로 a1=na(n1)a_1=n^a(n-1) 이고 r=n1nr=\dfrac{n-1}{n} 인것으로 생각하면

식을 잘 정리해서 분할정복을 이용한 거듭제곱을 쓰면 된다.

그런데 마지막 항은 naana(a+1)n^{a-a}-n^{a-(a+1)} 이 될 수 없으므로 n0n^0 만 사용해주는 방식으로 다시 n(n1)an \cdot (n-1)^a 를 더해주는 방식으로 답을 구해주자.

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;  
}

Tags:

Categories:

Updated:

Comments