数位DP求助,玄关
  • 板块学术版
  • 楼主exploration
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/15 09:23
  • 上次更新2024/7/15 09:31:53
查看原帖
数位DP求助,玄关
928965
exploration楼主2024/7/15 09:23

problem

感觉应该是mod的问题,95分求调

#include<bits/stdc++.h>
#define ll long long
#define mod 1000000007
using namespace std;
ll T,a,b,upper[25],dp[25][25];
ll dfs(ll v,ll sum,ll x,bool flag,bool lead)
{
	ll ans=0,up=flag?upper[x]:9;
	if (x==0) return sum%mod;
	if (dp[x][sum]!=-1&&!flag&&!lead) return dp[x][sum]%mod;
	for (ll i=0;i<=up;i++) ans=(ans+dfs(v,(i==v&&i!=0)||(i==v&&i==0&&!lead)?sum+1:sum,x-1,flag&&i==upper[x],lead&&i==0)+mod)%mod;
	if (!flag&&!lead) dp[x][sum]=ans%mod;
	return ans%mod;
}
ll solve(ll v,ll u)
{
	ll cnt=1;
	while (u) 
	{
		upper[cnt++]=u%10;
		u/=10;
	}
	for (ll i=0;i<=24;i++) for (ll j=0;j<=24;j++) dp[i][j]=-1;
	return dfs(v,0,cnt-1,1,1)%mod;
}
int main()
{
	scanf("%lld",&T);
	while (T--)
	{
		ll ans=0;
		scanf("%lld%lld",&a,&b);
		for (ll i=1;i<=9;i++) ans=(ans+(solve(i,b)%mod-solve(i,a-1)%mod)%mod*i+mod)%mod;
		printf("%lld\n",ans);
 	}
}
2024/7/15 09:23
加载中...