#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=30+5;
char s[maxn],l[maxn],r[maxn];
int len,tar,sum,st;
bool flag,vis[maxn];
void dfs()
{
if(st<5)
{
for(int i=0; i<len; i++)
if(!vis[i])
{
r[st++]=s[i];
int t=1;
for(int j=0; j<st; j++)//实现次方
t*=(s[i]-'A'+1);
if(st%2)
sum+=t;
else
sum-=t;
vis[i]=1;
dfs();
//还原部分
if(st%2)
sum-=t;
else
sum+=t;
st--;
vis[i]=0;
}
}
else if(sum==tar)
{
if(flag)//已经找到过
{
if(strcmp(l,r)<0) strcpy(l,r);//字典序最小
}
else strcpy(l,r);
flag=true;
}
}
int main()
{
while(~scanf("%d%s",&tar,s))
{
if(tar==0&&strcmp(s,"END")==0) break;
flag=false;
sum=0;
st=0;
len=strlen(s);
memset(vis,0,sizeof(vis));
dfs();
if(flag) printf("%s\n",l);
else printf("no solution\n");
}
return 0;
}
HDU 1015 Safecracker(深搜)
最新推荐文章于 2019-06-18 13:39:27 发布