暴力的从小到大枚举所有编号,如果当前编号和之前的有至少五位都一样那么说明这个编号是无效的跳过即可。现在问题变成了怎么判断之前存在和当前这个编号有至少五位数一样的编号——我们可以先枚举是哪五位然后再比这五位数的值,定义一个数组vis k b d表示k对应的这五位数的情况,五个数依次分别是abcde有没有出现过。
#include<iostream> #include<string> #include<math.h> #include<algorithm> #include<vector> #include<bits/stdc++.h> typedef long long ll; ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; } ll lcm(ll a, ll b) { return a * b / (gcd(a, b)); } #define PII pair<int,int> using namespace std; const int N = 2e6 + 10, mod = 1e9 + 7; int qmi(int a, int k, int p) //快速幂模板 { int res = 1; while (k) { if (k & 1) res = (ll)res * a % p; k >>= 1; a = (ll)a * a % p; } return res; } /////////////////////////////////////////////////////////// using namespace std; char ch[20]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; bool ans[25][20][20][20][20][20]; int main() { int n; cin>>n; memset(ans,0,sizeof(ans)); for (int a=0;a<16;a++) for (int b=0;b<16;b++) for (int c=0;c<16;c++) for (int d=0;d<16;d++) for (int e=0;e<16;e++) for (int g=0;g<16;g++) for (int h=0;h<16;h++) { if(ans[1][a][b][c][d][e]||ans[2][a][b][c][d][g]||ans[3][a][b][c][d][h]||ans[4][a][b][c][e][g]||ans[5][a][b][c][e][h]||ans[6][a][b][c][g][h]||ans[7][a][b][d][e][g]||ans[8][a][b][d][e][h]||ans[9][a][b][d][g][h]||ans[10][a][b][e][g][h]||ans[11][a][c][d][e][g]||ans[12][a][c][d][e][h]||ans[13][a][c][d][g][h]||ans[14][a][c][e][g][h]||ans[15][a][d][e][g][h]||ans[16][b][c][d][e][g]||ans[17][b][c][d][e][h]||ans[18][b][c][d][g][h]||ans[19][b][c][e][g][h]||ans[20][b][d][e][g][h]||ans[21][c][d][e][g][h]) continue; n--; if(n==0) { cout<<ch[a]<<ch[b]<<ch[c]<<ch[d]<<ch[e]<<ch[g]<<ch[h]<<endl; return 0; } ans[1][a][b][c][d][e]=ans[2][a][b][c][d][g]=ans[3][a][b][c][d][h]= ans[4][a][b][c][e][g]=ans[5][a][b][c][e][h]=ans[6][a][b][c][g][h]=ans[7][a][b][d][e][g]=ans[8][a][b][d][e][h]=ans[9][a][b][d][g][h]=ans[10][a][b][e][g][h]=ans[11][a][c][d][e][g]=ans[12][a][c][d][e][h]=ans[13][a][c][d][g][h]=ans[14][a][c][e][g][h]=ans[15][a][d][e][g][h]=ans[16][b][c][d][e][g]=ans[17][b][c][d][e][h]=ans[18][b][c][d][g][h]=ans[19][b][c][e][g][h]=ans[20][b][d][e][g][h]=ans[21][c][d][e][g][h]=1; } return 0; }
第一次见嗷。