递推,但是要注意细节。题目的意思,就是求s(x) = i+(i+1)+(i+2),i<n。该表达中计算过程中CA恒为0(包括中间值)的情况。根据所求可推得。
1-10: 3
1-100: 3*4
1-1000: 3*4*4
1-10000: 3*4*4*4
1-10^n: 3*4^(n-1)。
并且需要注意,一旦发现某一位大于3,则应立即跳出累加的循环。比如,f(133) = 24,f(143) = 24。同时,单独讨论个位的情况。28行的break处理该种情况。
#include <cstdio>
#include <cstring> __int64 pre[];
char buf[]; int main() {
int i, k, len;
__int64 ans; pre[] = ;
pre[] = ;
for (i=; i<; ++i)
pre[i] = pre[i-]<<; while (scanf("%s", buf) != EOF) {
len = strlen(buf);
ans = ;
for (i=; i<len; ++i) {
k = buf[i] - '';
if (i == len-) {
if (k > )
ans += ;
else
ans += k;
} else if (k > ) {
ans += pre[len-i]*;
break;
} else
ans += k*pre[len-i-]*;
}
printf("%I64d\n", ans);
} return ;
}