【来源】
2008年哈尔滨区域赛
【题目链接】:
http://acm.hdu.edu.cn/showproblem.php?pid=2451
【参考博客】:
HDU 2451 Simple Addition Expression
【题意】:
题意是要判断前n位数字(不包括n),有多少个数字 i 跟前面两个 i+1 , i+2 ,相加时不进位 。
符合要求的数字就是个位 0 ~ 2 ,其余位 0 ~ 3。
用一个dfs就可以搜出来了。
对于当前位是 x 的话 , 若果 x > 3 , 可以直接得出可以构成 [ 4^(位数-1) * 3 ] 个数
若果 x <= 3 的话 , 就可以构成 [ (x-1)*4^(位数-1)*3 + 后面的位能组成数字的数目(递归求) ]。
【注意】
我第一次交的时候忽略了一种情况,就是其他位置(除个位外)为3的情况。
真的忽略了,一直以为都是3*3*3.....,其实是4*4*4*.....*3
别人都是用回溯什么写的,
我自己用for循环写出来了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 #include<iostream> 4 using namespace std; 5 typedef long long ll; 6 const ll N = 1e10; 7 const ll M = 3145728; 8 int main() 9 { 10 ll n; 11 while(~scanf("%lld",&n)) { 12 ll ans = 0, tmp = 1; 13 14 if( n <= 9 ){ 15 printf("%lld ",min(3ll,n)); 16 continue ; 17 } 18 n ++ ; 19 for (ll i = N, j = M; i >= 1; i /= 10, j /= 4) { 20 if (n / i == 0) continue; 21 if (n / i >= 4) { 22 //printf("# 1 %lld , %lld ",i,j); 23 ans += tmp * j; 24 break; 25 } 26 if (n / i <= 3) { 27 ans += (n / i) * j/4 ; 28 //printf("# 2 %lld , %lld ",i,j); 29 } 30 31 n = n % i ; 32 } 33 printf("%lld ", ans); 34 } 35 return 0; 36 }