看来我就是讨厌麻烦的题啊...跳过去这么多实现题...
不过此题在思路上和实现上均不难.
我的代码里:
A[i]=满足条件的i位数中末尾不为0的, B[i]=满足条件的i位数中末尾为0的.
那么递推方程就很简单了:
A[i]=(A[i-1]+B[i-1])*(k-1)
B[i]=A[i-1]
结果是A[n]+B[n].
其实搞了半天我们发现B[i]的存在就是多余的, 直接A[i]=(A[i-1]+A[i-2])*(k-1)就得了
不过以上方法在递推中还是很好用的, 直观, 合并也不难.
下面的代码就很crude了.
十分不完美.
如果你看到了感觉很失望, 可以用动态内存, 可以用滚动数组, 可以把B[]和T[]都删掉,
可以把高精度中每一个数变成9位而不是6位, 可以不用i<500那么白痴的循环.
不过这些对AC毫无影响, 甚至用这么一个crude到vulgar的代码来AC毫无压力.
这就是人生.
#include<iostream> using namespace std; int A[2000][500],B[2000][500]; int n,k; void want(int t) { int T[500],i; memset(T,0,sizeof(T)); for(i=0;i<499;i++) { T[i]+=(A[t-1][i]+B[t-1][i])*(k-1); } for(i=0;i<499;i++) { if(T[i]>=1000000) { T[i+1]+=T[i]/1000000; T[i]%=1000000; } } for(i=0;i<500;i++) { A[t][i]=T[i]; } for(i=0;i<500;i++) { B[t][i]=A[t-1][i]; } return; } int main() { int i; int T[500]; memset(T,0,sizeof(T)); scanf("%d%d",&n,&k); A[1][0]=k-1; for(i=2;i<=n;i++) { want(i); } for(i=0;i<500;i++) { T[i]=A[n][i]+B[n][i]; } for(i=0;i<500;i++) { if(T[i]>=1000000) { T[i+1]+=T[i]/1000000; T[i]%=1000000; } } for(i=499;i>=0;i--) { if(T[i]>0) { printf("%d",T[i]); break; } } i--; for(;i>=0;i--) { printf("%06d",T[i]); } printf("/n"); return 0; }