题目大意:给出一个数字 n ,规定 S( x ) 为数字 x 的数位和,现在问有多少对 ( A , B ) ,满足 A <= B 且 S( A ) > S( B )
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
int bits[110];
ll f[110][2000][2][2];
const ll mod=1e9+7;
char s[110];
ll dfs(int pos,int num,int flag1,int flag2)
{
if(pos==0) return num>1000;
if(f[pos][num][flag1][flag2]!=-1) return f[pos][num][flag1][flag2];
int x=flag1?9:bits[pos];
ll ans=0;
for(int i=0;i<=x;i++)//B
{
for(int j=0;j<=(flag2?9:i);j++)//A
{
ans+=dfs(pos-1,num+j-i,flag1||i<x,flag2||(j<(flag2?9:i)))%mod;
ans%=mod;
}
}
f[pos][num][flag1][flag2]=ans;
return ans;
}
int main()
{
scanf("%s",s+1);
int len=strlen(s+1);
memset(f,-1,sizeof f);
for(int i=1;i<=len;i++)
{
bits[i]=s[len-i+1]-'0';
}
printf("%lld\n",dfs(len,1000,0,0));
}