2020牛客暑期多校训练营(第六场)H

Harmony Pairs

https://ac.nowcoder.com/acm/contest/5671/H

题目描述

  Roundgod is obsessive about numbers. Let be the sum of the digits of in decimal notation, is a harmony pair if and only if . Roundgod is given , and she wants to count the number of harmony pairs modulo satisfying .

输入描述

  The only line of input contains one integer .

输出描述

  Output one integer indicating the answer.

示例1

输入

100

输出

967

  比较套路的数位 问题。
   的数位长度为 ,同时构造 的第 位(数位自左向右,左边的数位小),采用记忆化搜索的形式。 表示对 的限制,限制 表示对 的限制,限制 。定义 表示 位, 时,构造 的方案数。由于 有可能为负数,所以需要加上 的偏移量。

代码

/******************************************************************
Copyright: 11D_Beyonder All Rights Reserved
Author: 11D_Beyonder
Problem ID: 2020牛客暑期多校训练营(第六场) Problem H
Date: 8/27/2020
Description: Digit Dynamic Programming
*******************************************************************/
#include<iostream>
#include<cstring>
using namespace std;
const int N=102;
const int mod=1000000007;
int f[N][N*22][2][2];
int number[N];
int len;
char str[N];
int dfs(int pos,int difference,bool limit1,bool limit2){
    if(pos==len+1){
        //减去偏移量差值大于0表示可行
        return difference>1000;
    }
    if(~f[pos][difference][limit1][limit2]){
        return f[pos][difference][limit1][limit2];
    }
    int res1=limit1?number[pos]:9;
    int ans=0;
    for(register int i=0;i<=res1;i++){
        //枚举B的数位
        int res2=limit2?i:9;
        for(register int j=0;j<=res2;j++){
            //枚举A的数位
            ans+=dfs(pos-1,difference+j-i,i==res1&&limit1,i==j&&limit2);
            ans%=mod;
        }
    }
    f[pos][difference][limit1][limit2]=ans;
    return f[pos][difference][limit1][limit2];
}
int main(){
    cin>>(str+1);
    len=strlen(str+1);
    //12345
    for(register int i=1;i<=len;i++){
        //按照习惯排列
        number[i]=str[i]-'0';
    }
    memset(f,-1,sizeof(f));
    cout<<dfs(1,1000,1,1)<<endl;
    return 0;
}
牛客暑期多校训练营题解 文章被收录于专栏

收集牛客暑期多校训练营的题解

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务