题意:问K进制的N位数中没有连续的0的数的个数。 2 ≤ K ≤ 10; N ≥ 2; N + K ≤ 180.
分析:和1009方法一样,但要用高精度计算加,乘。
Code:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define LL long long
#define pb push_back
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=55;
int f[200][2][222];
int n,k;
void add(int a[],int b[],int c[]){
for(int i=1;i<=210;i++){
c[i]+=a[i]+b[i];
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
void mult(int a[],int x){
for(int i=1;i<=210;i++){
a[i]*=x;
a[i]+=(a[i-1]/10);
a[i-1]%=10;
}
}
int main()
{
scanf("%d %d",&n,&k);
memset(f,0,sizeof(f));
f[1][0][1]=0;
f[1][1][1]=k-1;
for(int i=2;i<=n;i++){
for(int j=1;j<=210;j++) f[i][0][j]=f[i-1][1][j];
add(f[i-1][0],f[i-1][1],f[i][1]);
mult(f[i][1],k-1);
}
for(int i=1;i<=210;i++){
f[n+1][0][i]+=f[n][0][i]+f[n][1][i];
f[n+1][0][i+1]=f[n+1][0][i]/10;
f[n+1][0][i]%=10;
}
int id=210;
while(!f[n+1][0][id]) id--;
for(int i=id;i>=1;i--) printf("%d",f[n+1][0][i]);
printf("\n");
return 0;
}