poj 3899 The Lucky Numbers

来源:互联网 发布:unity3d 上海 外包 编辑:程序博客网 时间:2024/06/05 03:01

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

原创粉丝点击