• [swustoj 917] K-lucky-number


    K-lucky-number(0917)

    问题描述

    K-lucky-number is defined as add up the number of each bit is a multiple of K.for example, 24 is a 3-lucky-number,because 2+4=6, 6 is a multiple of 3.Now, there is a closed interval from L to R, please output the sum of squares of the K-lucky-number in this interval.

    输入

    The first line of input is the number of test cases T.

    For each test case have one line contains three integer L, R, K(0<L<=R<10^9, 1<k<30).

    输出

    For each test case output the answer the sum of squares of the K-lucky-number in this interval and mod 1000000007.

    样例输入

    2
    1 10 6
    100 1000 7

    样例输出

    36
    46057247

    有点6、= =

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    #define ll long long
    #define MOD 1000000007
    #define INF 0x3f3f3f3f
    #define N 50
     
    struct Node{
        ll cnt,sum,sqsum; //个数,和,平方和
    };
     
    int l,r,k;
    int bit[N];
    ll p10[N];
    Node dp[N][N];
     
    void init()
    {
        p10[0]=1;
        for(int i=1;i<=20;i++) p10[i]=p10[i-1]*10%MOD;
    }
    Node dfs(int pos,int mod,bool limit)
    {
        Node ans;
        ans.cnt=ans.sum=ans.sqsum=0;
        if(pos==-1){
            if(!mod) ans.cnt=1;
            else ans.cnt=0;
            return ans;
        }
        if(!limit && dp[pos][mod].sum!=-1) return dp[pos][mod];
        int end=limit?bit[pos]:9;
        for(int i=0;i<=end;i++){
            Node tmp=dfs(pos-1,(mod+i)%k,(i==end)&&limit);
            ans.cnt=(ans.cnt+tmp.cnt)%MOD;
            ans.sum=(ans.sum + tmp.sum + i*p10[pos]%MOD*tmp.cnt%MOD)%MOD;
            ans.sqsum=(ans.sqsum + i*i*p10[pos]%MOD*p10[pos]%MOD*tmp.cnt%MOD + 2*i*p10[pos]%MOD*tmp.sum%MOD + tmp.sqsum)%MOD;
        }
        if(!limit) dp[pos][mod]=ans;
        return ans;
    }
    ll solve(int n)
    {
        int len=0;
        while(n){
            bit[len++]=n%10;
            n/=10;
        }
        return dfs(len-1,0,1).sqsum;
    }
    int main()
    {
        init();
        int T;
        scanf("%d",&T);
        while(T--)
        {
            memset(dp,-1,sizeof(dp));
            scanf("%d%d%d",&l,&r,&k);
            printf("%lld
    ",(solve(r)-solve(l-1)+MOD)%MOD); 
        }
        return 0;
    }
  • 相关阅读:
    阿米巴
    linux系统和依赖包常用下载地址
    chm格式文件能打开,但看不到内容问题
    云计算的三层SPI模型
    云计算相关的一些概念Baas、Saas、Iaas、Paas
    IOS 开发环境,证书和授权文件等详解
    Android MDM参考
    理解RESTful架构
    联想小新Air2020锐龙版在Ubuntu下添加指纹识别
    避免踩坑,这才是为知笔记导入印象笔记数据的正确姿势
  • 原文地址:https://www.cnblogs.com/hate13/p/4571673.html
Copyright © 2020-2023  润新知