社区讨论

一个疑问

P4124[CQOI2016] 手机号码参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mhjax8y6
此快照首次捕获于
2025/11/03 23:35
4 个月前
此快照最后确认于
2025/11/03 23:35
4 个月前
查看原帖
CPP
//计数器一定要能计数
//计数器一定要能计数
#include<bits/stdc++.h>
#define int long long
using namespace std;
int l,r,a[13],dp[13][13][4][4][2][2],len;
bool vis[13][13][4][4][2][2];
int dfs(int pos,int las,int lnum,int maxn,bool f4,bool f8,bool lim){//las:上一位填的数,lnum:末尾连续相同的长度,maxn:连续相同长度的最大值
//int dfs(int pos,int las,int lnum,bool maxn,bool f4,bool f8,bool lim){//maxn:连续相同长度的最大值是否大于3
	if(pos<=0)return ((maxn>=3)?1:0);//
	//if(pos<=0)return maxn?1:0;
	if(!lim&&vis[pos][las][lnum][maxn][f4][f8])return dp[pos][las][lnum][maxn][f4][f8];
	int mx=(lim?a[pos]:9);
	int ret=0;
	for(int i=(pos==len?1:0);i<=mx;i++){
		if(i==4&&f8)continue;
		if(i==8&&f4)continue;
		ret+=dfs(pos-1,i,(i==las?lnum+1:1),max(maxn,(i==las?lnum+1:1)),(f4||(i==4)),(f8||(i==8)),(lim&&(i==a[pos])));//
		//ret+=dfs(pos-1,i,(i==las?lnum+1:1),(maxn||(i==las?lnum+1:1)>=3),(f4||(i==4)),(f8||(i==8)),(lim&&(i==a[pos])));
	}
	if(!lim)vis[pos][las][lnum][maxn][f4][f8]=1,dp[pos][las][lnum][maxn][f4][f8]=ret;
	return ret;
}
inline int solve(int x){
	len=0;
	while(x){
		a[++len]=x%10;
		x/=10;
	}
	if(len<=10)return 0;
	return dfs(len,11,0,0,0,0,1);
}
signed main(){
	cin>>l>>r;
	cout<<solve(r)-solve(l-1);
	return 0;
}
上述代码连样例都过不了,但如果用第8、10、18行分别替换第7、9、17行就能通过。有人知道是为什么吗?

回复

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

正在加载回复...