http://poj.org/problem?id=3899
思路:
1. 可以总结出n位数的lucky numbers有2^n个
2. 求[A,B]间的lucky numbers个数,如果A和B位数相同,则求f(A,B),否则造出一个数C=99…9,位数和A相同,一个数D=11…1,位数和B相同,求f(A,C)+f(B,D)+2^i(i为大于A的位数小于B的位数的所有整数)
现在就转化为求子问题f(A,B),A和B位数相同。
1. [A,B]间的lucky number包括三部分组成,一部分是小于A的(4),一部分是大于B的(3),还有就是介于A、B间的(2)
2. 可以比较容易求出与x位数相同但小于x的lucky number数g(x),则AB间的lucky number数目为g(B+1)-g(A),实现只要注意是否包括A\B
3. 可以比较容易求出与x位数相同本身大于B但逆序后小于x的lucky number数h(x,B),则逆序后在[A,B]间但大于B的数为h(B,B)-h(A,B)
4. 可以比较容易求出与x位数相同本身小于A但逆序后大于x的lucky number数r(x,A),则逆序后在[A,B]间但小于A的数为r(A,A)-r(B,A)
这样问题就解决了。
见:http://poj.org/problemstatus?problem_id=3899
几个函数:
__int64 g(char s[],bool flag) //2,flag true包括该数,否则不包括
{
__int64 res = 0;
int n = strlen(s);
int i;
for(i = 0;i < n;i ++)
{
if(s[i] < '4')
return res;
if(s[i] > '7'){
res += tab[n-i];
return res;
}
if(s[i] > '4'&&s[i] < '7'){
res += tab[n-i-1];
return res;
}
if(s[i] == '7')
res += tab[n-i-1];
}
if(flag && i == n)
res ++;
return res;
}
//s为x,s2为B,flag同上
__int64 h(char s[],char s2[],bool flag)
{
__int64 res = 0;
int n = strlen(s);
char str[50];
strcpy(str,s);
int i;
for(i = 0;i < n;i ++)
{
if(s[i] < '4')
return res;
if(s[i] > '7'){
str[i] = '4';
res += get(s2,i+1,str);
str[i] = '7';
res += get(s2,i+1,str);
return res;
}
if(s[i] > '4'&&s[i] < '7'){
str[i] = '4';
res += get(s2,i+1,str);
return res;
}
if(s[i] == '7'){
str[i] = '4';
res += get(s2,i+1,str);
str[i] = s[i];
}
}
if(flag){
for(i = 0;i < n;i ++){
if(s[n-1-i]>s2[i]){
res ++;
break;
}
else if(s[n-1-i]<s2[i])
break;
}
}
return res;
}
//s为x,s2为A,flag同上
__int64 r(char s[],char s2[],bool flag)
{
__int64 res = 0;
int n = strlen(s);
char str[50];
strcpy(str,s);
int i;
for(i = 0;i < n;i ++)
{
if(s[i] < '4'){
str[i] = '4';
res += getd(s2,i+1,str);
str[i] = '7';
res += getd(s2,i+1,str);
return res;
}
if(s[i] > '7'){
return res;
}
if(s[i] > '4'&&s[i] < '7'){
str[i] = '7';
res += getd(s2,i+1,str);
return res;
}
if(s[i] == '4'){
str[i] = '7';
res += getd(s2,i+1,str);
str[i] = s[i];
}
}
if(flag){
for(i = 0;i < n;i ++){
if(s[n-1-i]<s2[i]){
res ++;
break;
}
else if(s[n-1-i]>s2[i])
break;
}
}
return res;
}