社区讨论
一个疑问
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 条回复,欢迎继续交流。
正在加载回复...