社区讨论

萌新求助为什么60

P3413SAC#1 - 萌数参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo33r47a
此快照首次捕获于
2023/10/24 00:18
2 年前
此快照最后确认于
2023/10/24 00:18
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
const int p=1e9+7;
#define rep(i,a,b) for(int i=a;i<=b;i++)
int dp[1010][11][11][2][2];
int a[1010];
int DP(int pos,
	int ls,int lls,
	int lim,int qd0)
{
	if(pos<0){
		return !qd0;
	}
	if(dp[pos][ls][lls][lim][qd0]!=-1){
		return dp[pos][ls][lls][lim][qd0];
	}
	int res=lim?a[pos]:9;
	int ret=0;
	rep(i,0,res){
		if(i==ls||i==lls){
			continue;
		}
		if(qd0&&i==0)
		ret+=DP(pos-1,10,10,lim&&(i==a[pos]),qd0&&(!i));
		else ret+=DP(pos-1,i,ls,lim&&(i==a[pos]),qd0&&(!i));
		ret%=p;
	}
	return dp[pos][ls][lls][lim][qd0]=ret;
}
int solve(char arr[],int len){
	rep(i,1,len){
		a[len-i]=arr[i]-'0';
	}
	memset(dp,-1,sizeof dp);
	return DP(len-1,10,10,1,1);
}
char arr[1010];
int meng(int s){
	rep(i,2,s){
		if(arr[i]==arr[i-1])return 1;
		if(i>2&&arr[i]==arr[i-2])return 1;
	}
	return 0;
}
signed main(){
	scanf("%s",arr+1);
	int s=strlen(arr+1);
	auto x=solve(arr,s);
	int good=meng(s);
	int w=0;
	rep(i,1,s){
		w=(w*10%p+arr[i]-'0')%p;
	}
	x=(w-x)%p+p;x%=p;
	scanf("%s",arr+1);
	s=strlen(arr+1);
	auto y=solve(arr,s);
	w=0;
	rep(i,1,s){
		w=(w*10%p+arr[i]-'0')%p;
	}
	y=(w-y)%p+p;y%=p;
	cout<<((y-x+good)%p+p)%p;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...