ural 1009 1012 1013 K-Based Numbers V1.02.03.0

    技术2024-07-01  79

    看来我就是讨厌麻烦的题啊...跳过去这么多实现题...

    不过此题在思路上和实现上均不难.

    我的代码里:

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

    最新回复(0)