⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pku2956.cpp

📁 这是ACM 方面的资料 是PKU的 北京大学的出来的
💻 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 + -