A了,但不解
  • 板块CF95D Horse Races
  • 楼主hxdts
  • 当前回复13
  • 已保存回复13
  • 发布时间2022/6/13 13:45
  • 上次更新2023/10/27 23:23:09
查看原帖
A了,但不解
363350
hxdts楼主2022/6/13 13:45

WA:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int t,k,maxn[1010],len,f[1010][1010][2];
//char l[1010],r[1010];
string l,r;
int dfs(int x,int last,bool flag,bool done)
{
	if(!x)
	return done;
	if(!flag&&f[x][last][done]!=-1)
	return f[x][last][done];
	int lim=flag?maxn[x]:9,sum=0;
	for(int i=0;i<=lim;i++)
	if(i==4||i==7)
	sum=(sum+dfs(x-1,x,flag&&i==lim,done||(last&&last-x<=k)))%mod;
	else
	sum=(sum+dfs(x-1,last,flag&&i==lim,done))%mod;
	if(!flag)
	f[x][last][done]=sum;
	return sum;
}
//int ask(char s[])
int ask(string s)
{
//	int n=strlen(s);
	int n=s.size();
	for(int i=1;i<=n;i++)
	maxn[i]=s[n-i]-'0';
	return dfs(n,0,1,0);
}
//bool check(char s[])
bool check(string s)
{
//	int n=strlen(s),last=-2000;
	int n=s.size(),last=-2000;
	for(int i=0;i<n;i++)
	if(s[i]=='4'||s[i]=='7')
	{
		if(i-last<=k)
		return 1;
		last=i;
	}
	return 0;
}
signed main()
{
	cin>>t>>k;
	memset(f,-1,sizeof(f));
	while(t--)
	{
//		scanf("%s%s",l,r);
		cin>>l>>r;
		cout<<((ask(r)-ask(l)+check(l))%mod+mod)%mod<<endl;
	}
}

A

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
int t,k,maxn[1010],len,f[1010][1010][2];
//char l[1010],r[1010];
string l,r;
int dfs(int x,int last,bool flag,bool done)
{
	if(!x)
	return done;
	if(!flag&&f[x][last][done]!=-1)
	return f[x][last][done];
	int lim=flag?maxn[x]:9,sum=0;
	for(int i=0;i<=lim;i++)
	if(i==4||i==7)
	sum=(sum+dfs(x-1,x,flag&&i==lim,done||last-x<=k))%mod;
	else
	sum=(sum+dfs(x-1,last,flag&&i==lim,done))%mod;
	if(!flag)
	f[x][last][done]=sum;
	return sum;
}
//int ask(char s[])
int ask(string s)
{
//	int n=strlen(s);
	int n=s.size();
	for(int i=1;i<=n;i++)
	maxn[i]=s[n-i]-'0';
	return dfs(n,3000,1,0);
}
//bool check(char s[])
bool check(string s)
{
//	int n=strlen(s),last=-2000;
	int n=s.size(),last=-2000;
	for(int i=0;i<n;i++)
	if(s[i]=='4'||s[i]=='7')
	{
		if(i-last<=k)
		return 1;
		last=i;
	}
	return 0;
}
signed main()
{
	cin>>t>>k;
	memset(f,-1,sizeof(f));
	while(t--)
	{
//		scanf("%s%s",l,r);
		cin>>l>>r;
		cout<<((ask(r)-ask(l)+check(l))%mod+mod)%mod<<endl;
	}
}
2022/6/13 13:45
加载中...