AcWing 1084. 数字游戏 II
原题链接
中等
作者:
最后五分钟
,
2025-04-04 02:02:44
· 江西
,
所有人可见
,
阅读 2
#include<bits/stdc++.h>
#define int long long
#define deg(a) cout << #a << " = " << a << "\n";
#define de(a) cout << #a << " = " << a << " ";
#define x first
#define y second
using namespace std;
const int N=30,M=100;
int f[N][10][M];
int a,b,mod;
int dp(int t)
{
if(!t)return 1;
vector<int> num;
while(t)num.push_back(t%10),t/=10;
int res=0;
int ls=0;
for(int i=num.size()-1;~i;i--)
{
int x=num[i];
for(int j=0;j<x;j++)
res+=f[i+1][j][(mod-ls)%mod];
ls=(ls+x)%mod;
if(!i&&!ls)res++;
}
return res;
}
void init(int mod)
{
memset(f,0,sizeof f);
for(int i=0;i<=9;i++)f[1][i][i%mod]=1;
for(int i=2;i<N;i++)
for(int j=0;j<=9;j++)
for(int m=0;m<mod;m++)
for(int k=0;k<=9;k++)
f[i][j][m]+=f[i-1][k][(m-j+10*mod)%mod];
}
void sol(int l,int r,int mod)
{
init(mod);
cout<<dp(r)-dp(l-1)<<endl;
}
signed main()
{
while(cin>>a>>b>>mod)
{
sol(a,b,mod);
}
return 0;
}