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; }
牛客暑期多校训练营题解 文章被收录于专栏
收集牛客暑期多校训练营的题解