萌新袜子求助,数位DP,悬赏3RMB
查看原帖
萌新袜子求助,数位DP,悬赏3RMB
739297
iiiiiyang楼主2022/9/4 20:48

WA了三个点,都是读到了负数

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int mod=1e9+7;
int dp[10010][15][15];
string l,r,s;

inline void init()
{
	for(int i=0;i<=9;i++)
		for(int j=0;j<=9;j++)
			if(i!=j)
				++dp[2][i][j];
	for(int i=3;i<=1000;++i)
		for(int j=0;j<=9;++j)
			for(int k=0;k<=9;++k)
			{
				if(k==j) continue;
				for(int u=0;u<=9;++u)
					if(k!=u&&j!=u)
						dp[i][j][k]=(dp[i][j][k]+dp[i-1][k][u])%mod;
			}
	return;
}

int a[10010];
inline int Digit_DP(string str)
{
	memset(a,0,sizeof a);
	int num=str.size(),ans=0,sum=0,p=1;
	if(num==1) return 0;
	for(int i=num;i>=1;--i)
		a[i]=str[num-i]-'0',sum=(sum*10+a[i])%mod;
	sum=(sum+1)%mod;
	ans+=10;
	for(int i=2;i<num;++i)
		for(int j=1;j<=9;++j)
			for(int k=0;k<=9;++k)
				ans=(ans+dp[i][j][k])%mod;
	int last=-1,last2=-1,now;
	for(int i=num;i>=2;--i)
	{
		now=a[i];
		for(int j=(i==num);j<now;++j)
			for(int k=0;k<=9;++k)
				if(last!=j&&last2!=j&&last!=k&&j!=k)
					ans=(ans+dp[i][j][k])%mod;
		if(last==now||last2==now) {p=0;break;}
		last2=last,last=now;
	}
	if(p)
		for(int i=0;i<=a[1];++i)
			if(i!=last&&i!=last2) 
				ans=(ans+1)%mod;
	return (sum-ans)%mod;
}

int n;
inline void read()
{
	getline(cin,s);
	for(n=0;n<s.size();++n)
	{
		if(s[n]==' ') break;
		l+=s[n];
	}
	++n;
	for(n;n<s.size();++n)
		r+=s[n];
	return;
}

int ans;
inline void getans()
{
	ans=Digit_DP(r)-Digit_DP(l);
	if(l[1]==l[0]) {ans=(ans+1)%mod;return;}
	for(int i=2;i<l.size();++i)
		if(l[i]==l[i-1]||(l[i]==l[i-2]))
		{
			ans=(ans+1)%mod;
			return;
		}
}

signed main()
{
	init();	
	read();
	getans();
	cout<<ans;
	return (0-0);
}
2022/9/4 20:48
加载中...