• Codeforces 55D (数位DP+离散化+数论)


    题目链接http://poj.org/problem?id=2117

    题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除。范围2^64。

    解题思路

    一开始SB地开了10维数组记录情况。

    首先要求能被各位上的数整除,可以转化为被一个数整除问题。

    这个数就是各位上数的最小公倍数LCM(不是GCD)。

    其次,处理整除问题,得转化成数位DP的余数模板。1~9的LCM最大是2520, 那么%2520,让其可以开数组进行记忆化搜索。

    最后, 对于不能%2520最后结果,再%各个数位累计过来的LCM。

    这样下来,需要开20*2520*2520的数组,往CF上一交你会发现MLE。

    仔细观察每次的LCM,其范围是1~2520没错,但是都是整除gcd的结果(LCM=a*b/gcd(a,b) ),也就是说所有LCM都是某个数的约数。

    这个数其实就是2520。所以DP之前,为2520打个表,把LCM给离散化Hash。这样其实只有48个LCM了。数组开20*2520*50即可。

    注意结果是int64。

    #include "cstdio"
    #include "cstring"
    using namespace std;
    #define LL long long
    LL dp[20][2530][50],digit[20],Hash[2530];
    int gcd(int a,int b) {return b==0?a:gcd(b,a%b);}
    int lcm(int a,int b) {return a*b/gcd(a,b);}
    LL dfs(int len,int Remain,int Lcm,bool fp)
    {
        if(!len) return Remain%Lcm?0:1;
        printf("%d
    ",Lcm);
        if(!fp&&dp[len][Remain][Hash[Lcm]]!=-1) return dp[len][Remain][Hash[Lcm]];
        LL ret=0,fpmax=fp?digit[len]:9;
        for(int i=0;i<=fpmax;i++)
            ret+=dfs(len-1,(Remain*10+i)%2520,i==0?Lcm:lcm(Lcm,i),fp&&i==fpmax);
        if(!fp) dp[len][Remain][Hash[Lcm]]=ret;
        return ret;
    }
    LL f(long long x)
    {
        int len=0;
        while(x)
        {
            digit[++len]=x%10;
            x/=10;
        }
        return dfs(len,0,1,true);
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int T;
        LL l,r,cnt=0;
        scanf("%d",&T);
        memset(dp,-1,sizeof(dp));
        for(int i=1;i*i<=2520;i++)
        {
            if(2520%i==0)
            {
                Hash[i]=cnt++;
                if(i*i!=2520) Hash[2520/i]=cnt++;
            }
        }
        while(T--)
        {
            scanf("%I64d%I64d",&l,&r);
            LL res=f(r)-f(l-1);
            printf("%I64d
    ",res);
        }
    }
  • 相关阅读:
    Bug测试报告--在线考试系统--金州勇士
    Bug测试报告--食物链教学工具--奋斗吧兄弟
    Jquery对象和dom对象获取html的方法
    mysql中常见的存储引擎和索引类型
    转:spring MVC HTTP406 Not Acceptable
    Mybatis动态建表
    ssm框架插入mysql数据库中文乱码问题解决
    Maven环境下Poi的使用
    【转】Mybatis传多个参数(三种解决方案)
    【译文】用Spring Cloud和Docker搭建微服务平台
  • 原文地址:https://www.cnblogs.com/neopenx/p/4063647.html
Copyright © 2020-2023  润新知