根据题目所给,整数N最大达到了10^12,而C++默认1s的运算量只有10^8,所以这道题用for从1开始暴力到N肯定行不通(在蓝桥杯说不定能拿点分)。
那我们换一个思路,直接去枚举所有可行的幸运数字。
要枚举的数字,每位上都可以是(8,2,6,9),如果有两位数,最多有4*4种情况,三位数就是4*4*4,N<10^12,易得最多12位,复杂度最大4^12,大约一千万的计算量,小于一个亿。
所以直接一个深搜就可以解决这道题。
约束条件:1、(8,2,6,9)每个都至少有一个
2、枚举出来的数要小于输入的N
解空间树:
然后根据解空间树写递归就可以了。
AC代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,vis[10],ans;
void dfs(int now){
if(now>n)return;
if(now<=n and vis[8] and vis[2] and vis[6] and vis[9])ans++;
vis[8]++;
dfs(now*10+8);
vis[8]--;
vis[2]++;
dfs(now*10+2);
vis[2]--;
vis[6]++;
dfs(now*10+6);
vis[6]--;
vis[9]++;
dfs(now*10+9);
vis[9]--;
}
signed main(){
cin>>n;
dfs(0);
cout<<ans;
return 0;
}