📄 pku2956.cpp
字号:
//PKU2956.cpp
#include <stdio.h>
#include <string.h>
int A[11][11];
int L;
int v[11];
int u[11];
void init()
{
int i, j;
for (i = 0; i < 11; i++)
A[i][0] = 1;
for (i = 1; i < 11; i++)
{
for (j = 1; j <= i; j++)
A[i][j] = A[i][j - 1] * (i - j + 1);
}
}
void DFS(int l, int xx)
{
int i, j, p;
if (l == L)
{
for (i = 0; i < L; i++)
printf("%d", v[i]);
printf("\n");
return;
}
for (i = 0, j = 1; i < 10; i++)
{
if (xx > A[9-l][L-l-1])
{
xx -= A[9-l][L-l-1];
j++;
}
else
break;
}
p = j;
j = 0;
for (i = 0; i < 10; i++)
{
if (!u[i])
{
j++;
if (j == p)
break;
}
}
v[l] = i;
u[i] = 1;
DFS(l+1, xx);
}
void solve(int x)
{
int xx = x;
int i;
i = 1;
while (xx > A[10][i] - A[9][i-1])
{
xx -= A[10][i] - A[9][i-1];
i++;
}
L = i;
memset(u, 0, sizeof(u));
for (i = 1; i < 10; i++)
{
if (xx > A[9][L-1])
xx -= A[9][L-1];
else
break;
}
v[0] = i;
u[i] = 1;
DFS(1, xx);
}
int main()
{
int x;
init();
while (EOF != scanf("%d", &x) && x > 0)
solve(x);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -