zoukankan      html  css  js  c++  java
  • Investigating Div-Sum Property UVA

    An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is divisible
    by 3 and 12(3+7+0+2) is also divisible by 3. This property also holds for the integer 9.
    In this problem, we will investigate this property for other integers.
    Input
    The first line of input is an integer T (T < 100) that indicates the number of test cases. Each case is
    a line containing 3 positive integers A, B and K. 1 ≤ A ≤ B < 2
    31 and 0 < K < 10000.
    Output
    For each case, output the number of integers in the range [A, B] which is divisible by K and the sum
    of its digits is also divisible by K.
    Sample Input
    3
    1 20 1
    1 20 2
    1 1000 4
    Sample Output
    20
    5
    64

    求n到m间有多少个数本身能整除k,各位相加和也能整除k,注意直接for循环用普通逻辑做会时间超限

    需用到数位dp

    #include<cstdio>
    #include<cstring>
    using namespace std;
    typedef long long ll;
    int a,b,MOD,T;
    int dp[15][90][90],pow_10[15];
    int f(int d,int m1,int m2)//数位dp
    {
        if(dp[d][m1][m2]!=-1)
        {
            return dp[d][m1][m2];
        }
        dp[d][m1][m2]=0;
        for(int i=0; i<10; i++)
        {
            dp[d][m1][m2]+=f(d-1,(m1+i)%MOD,(m2+i*pow_10[d-1])%MOD);
        }
        return dp[d][m1][m2];
    }
    int calc(int x)//处理下每个数
    {
        int len=0;
        if(!x)
        {
            len=1;
        }
        int t=x;
        while(t)
        {
            ++len;
            t/=10;
        }
        int res=0,LeftSide=0,SumDigits=0;
        for(int i=1; i<=len; i++)
        {
            while((ll)LeftSide+(ll)pow_10[len-i]-1ll<=(ll)x)
            {
                res+=f(len-i,SumDigits%MOD,LeftSide%MOD);
                LeftSide+=pow_10[len-i];
                ++SumDigits;
            }
        }
        return res;
    }
    int main()
    {
        scanf("%d",&T);
        pow_10[0]=1;
        for(int i=1; i<=9; ++i)
        {
            pow_10[i]=pow_10[i-1]*10;//首先存下每位的值,如0对应1,1对应10
        }
        for(; T; --T)
        {
            scanf("%d%d%d",&a,&b,&MOD);
            if(MOD>82)//2的31次方各位数之和最大为81
            {
                puts("0");
                continue;
            }
            memset(dp,-1,sizeof(dp));
            for(int i=0; i<MOD; ++i)
            {
                for(int j=0; j<MOD; ++j)
                {
                    dp[0][i][j]=0;
                }
            }
            dp[0][0][0]=1;
            printf("%d
    ",calc(b)-calc(a-1));
        }
        return 0;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    tfs2012服务器搭建报表、门户、TFS权限设置
    遥望星空FTP文件同步工具(附源码)1.0 发布
    TortoiseGit连接gitlab,一直要求输入密码
    static、const、readonly与static readonly的区别与联系
    sql server对并发的处理乐观锁和悲观锁
    asp.net控件开发基础系列
    Sonne的健身日志(15)16周腹肌计划第四周感受
    上海新闻!
    Sonne的健身日志(9)16周腹肌计划第一周(2012.3.92012.3.15)
    Sonne的健身日志(5)
  • 原文地址:https://www.cnblogs.com/l609929321/p/6895193.html
Copyright © 2011-2022 走看看