这道题是这一系列里最简单的= =
简单来说,这里要一位一位的判断,因为数字分成两种:0,后面必须跟非零;非零,后面都可以。
所以用1来表示非零数,按照规则动归或回溯。
#include<stdio.h>
int n,k;
int sum=0;
void zhixing(int i,int *a,int dum)
{
if(i==n){
sum+=dum;
return;
}
if(a[i-1]){
a[i]=1;
zhixing(i+1,a,dum*(k-1));
a[i]=0;
zhixing(i+1,a,dum);
}
else{
a[i]=1;
zhixing(i+1,a,dum*(k-1));
}
}
int main(void)
{
scanf("%d%d",&n,&k);
int a[20];
int i,j;
a[0]=1;
zhixing(1,a,k-1);
printf("%d\n",sum);
return 0;
}
动归短得多
#include <stdio.h>
#include <math.h>
long long dp[20][2];
int main()
{
int N,K,i;
scanf("%d%d",&N,&K);
dp[1][0]=0; dp[1][1]=K-1;
for(i=2; i<=N; i++)
{
dp[i][1]+=(K-1)*(dp[i-1][1]+dp[i-1][0]);
dp[i][0]=dp[i-1][1];
}
printf("%lld\n",dp[N][1]+dp[N][0]);
return 0;
}