题目大意:
在一个仅含有数字1-9(且每个数字最多出现一次)的数字N中,将N中的每一位重新排列(可以将N里的所有位全部重新排列,也可以只重新排列几位,或者不重新排列),使得排列后的新数字M是数字P~Q的公倍数,求所有的M,无解则输出No answer。
1<=P<=Q<=20
题解:
因为1~9最多出现一次,所以N最大是九位数,我们就直接搜索全排列的全部可能,总共有9!种可能,搜索则复杂度为9^9。
然后P,Q<=20,则每个枚举出来的答案要*(q-p),
则 9!(q-p)
时间复杂度:O(9^9+9!(Q-P))
var
num:array [1..9] of longint;
i,p,q:longint;
d:boolean;
s:string;
procedure dfs(dep,ans:longint);
var
i:longint;
begin
if dep>length(s)
then begin
for i:=p to q do
if ans mod i<>0 then exit;
d:=true;
writeln(ans);
exit;
end;
for i:=1 to 9 do
if num[i]=1 then
begin
dec(num[i]);
dfs(dep+1,ans*10+i);
inc(num[i]);
end;
end;
begin
assign(input,'lcs.in'); reset(input);
assign(output,'lcs.out');rewrite(output);
readln(s);
readln(p,q);
for i:=1 to length(s) do
inc(num[ord(s[i])-48]);
dfs(1,0);
if not(d) then writeln('No Answer');
close(input); close(output);
end.