模擬了半天,沒模擬出來...撐不住了看題解

汗了,看來確實要克服把每道題當模擬題做的缺點,多想想...

//edited by Eddy
//from BUAA SoftWare College
//any question:oeddyo@gmail.com

#include 
<iostream>
#include 
<cmath>
using namespace std;


int main()
{
    
int N,K;
    cin
>>N>>K;
    
int f[30];
    f[
0]=K-1;
    f[
1]=K*(K-1);
    
int i;
    
for(i=2;i<N;i++)
    
{
        f[i]
=(K-1)*(f[i-1]+f[i-2]);
    }

    cout
<<f[N-1];

return 0;
}


精華就在f[i]=(K-1)*(f[i-1]+f[i-2])這行
f[0]=K-1是自然,因為一位的時候0是不算的。
f[1]=K*(K-1),可以這樣想,當f[1]取K進制中某個除0以外的值的時候,后面的那位數字自己不斷變化,這個時候后面的那位數是可以取0的
從第3位開始,第N位的時候就相當于第N位隨便變(除0以外),先考慮后N-1位(第N-1位不能為0)。然后還有N-1位為0,后N-2位隨便變。加起來乘以K-1,即第N位隨便變的即可