萌新刚学数位dp求助
查看原帖
萌新刚学数位dp求助
771972
Ja711楼主2023/4/6 12:27

这是AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL; 
const int N=20,P=1e9+7;
LL f[N][10],l,r,k,b,t,power[N];//f[i][j]表示i位,最高位为j 的所有数字之和 
void init()
{
	power[0]=1;
	for(int i=1;i<N;i++)power[i]=10*power[i-1]%P;
	for(int i=0;i<=9;i++)f[1][i]=i;
	for(int i=2;i<N;i++)
	for(int j=0;j<=9;j++)	
	{
		f[i][j]=j*power[i-1]%P;
		for(int k=0;k<=9;k++)
		f[i][j]=(f[i][j]+f[i-1][k])%P;
	}
}
LL dp(LL n)
{
    if(!n)return 0;
    vector<int>nums;
    while(n)nums.push_back(n%10),n/=10;
    int sz=nums.size();
    LL res=0,s=nums[sz-1];
    for(int i=1;i<s;i++)res=(res+f[sz][i])%P;//比X小的	
    for(int i=nums.size()-2;i>=0;i--)
    {
    	int x=nums[i];
    	res=(res+power[i]*s*x)%P;// X自己    	
    	for(int j=0;j<x;j++)
    	res=(res+f[i+1][j])%P;//比X小的	
		s+=x;	  	 	
	}
	for(int i=1;i<nums.size();i++)//前导0的部分 
	for(int j=1;j<=9;j++)
	res=(res+f[i][j])%P;
	return res;
}
int main()
{
	init();
	cin>>t;
	while(t--)
	{
		cin>>l>>r;
		cout<<((dp(r+1)-dp(l))%P+P)%P<<endl;
	}
	return 0;
}

但是把最后一行改为dp(r)-dp(l-1)就全WA,实在想不通为啥,其他数位dp题两种写法应该都是可以的(吧,不太确定,但我做过的都一样

2023/4/6 12:27
加载中...