老师的九层循环超绝暴力题解
2024-08-08 11:07:16
发布于:上海
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 1e5 + 5;
typedef long long LL;
struct node{
long long next;
bool a, b, c;
};
long long n, ans;
int dir[3] = {3, 5, 7};
int vis[5];
bool init(long long x){
if(x > n) return 0;
if(vis[0] && vis[1] && vis[2]) return 1;
return 0;
}
void solve(){
for(int i = 0; i < 3; i++){
vis[i];
for(int j = 0; j < 3; j){
vis[j];
for(int k = 0; k < 3; k){
vis[k];
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100);
for(int p = 0; p < 3; p){
vis[p];
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000);
for(int l = 0; l < 3; l){
vis[l];
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000);
for(int m = 0; m < 3; m){
vis[m];
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000);
for(int q = 0; q < 3; q){
vis[q];
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000 + dir[q] * 1000000);
for(int h = 0; h < 3; h){
vis[h];
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000 + dir[q] * 1000000 + dir[h] * 10000000);
for(int v = 0; v < 3; v){
vis[v]++;
ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000 + dir[q] * 1000000 + dir[h] * 10000000 + dir[v] * 100000000);
vis[v]--;
}
vis[h]--;
}
vis[q]--;
}
vis[m]--;
}
vis[l]--;
}
vis[p]--;
}
vis[k]--;
}
vis[j]--;
}
vis[i]--;
}
}
int main(){
freopen("number.in", "r", stdin);
freopen("number.out", "w", stdout);
cin >> n;
solve();
cout << ans;
fclose(stdin);
fclose(stdout);
return 0;
}
全部评论 5
炫总无敌了
2024-08-08 来自 上海
2现在是我老实了😭
2024-08-08 来自 湖南
1@谁来教我c++
2024-08-08 来自 上海
1#include <algorithm> #include <iostream> #include <vector> #include <queue> using namespace std; const int N = 1e5 + 5; typedef long long LL; struct node{ long long next; bool a, b, c; }; long long n, ans; int dir[3] = {3, 5, 7}; int vis[5]; bool init(long long x){ if(x > n) return 0; if(vis[0] && vis[1] && vis[2]) return 1; return 0; } void solve(){ for(int i = 0; i < 3; i++){ vis[i]; for(int j = 0; j < 3; j){ vis[j]; for(int k = 0; k < 3; k){ vis[k]; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100); for(int p = 0; p < 3; p){ vis[p]; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000); for(int l = 0; l < 3; l){ vis[l]; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000); for(int m = 0; m < 3; m){ vis[m]; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000); for(int q = 0; q < 3; q){ vis[q]; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000 + dir[q] * 1000000); for(int h = 0; h < 3; h){ vis[h]; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000 + dir[q] * 1000000 + dir[h] * 10000000); for(int v = 0; v < 3; v){ vis[v]++; ans += init((LL)dir[i] + dir[j] * 10 + dir[k] * 100 + dir[p] * 1000 + dir[l] * 10000 + dir[m] * 100000 + dir[q] * 1000000 + dir[h] * 10000000 + dir[v] * 100000000); vis[v]--; } vis[h]--; } vis[q]--; } vis[m]--; } vis[l]--; } vis[p]--; } vis[k]--; } vis[j]--; } vis[i]--; } } int main(){ freopen("number.in", "r", stdin); freopen("number.out", "w", stdout); cin >> n; solve(); cout << ans; fclose(stdin); fclose(stdout); return 0; }
2024-08-17 来自 浙江
0就老实了
2024-08-08 来自 湖南
0逆天
2024-08-08 来自 上海
1什么意思质疑我老师
2024-08-08 来自 上海
1老师写的你叫神马
2024-08-08 来自 上海
1
有帮助,赞一个