Safecracker

GitHub跳转原题关系图返回列表

题意与原解析均从本地 OpenJudge 缓存迁移。

OJ: noi_openjudge

题目 ID: ch0201-250

难度:未知

标签:

日期: 2026-07-30 23:01

题意

完整题面见同目录的 problem.md

思路

代码

cpp
#include <bits/stdc++.h>
using namespace std;


int qua;
char letters[100];
int len;
char choose[10];
char ans[10];
int vis[100] = { 0 };
bool is_get_ans;

/* 求 a^n */
int _pow(int a,int n){
	int base = a;
	int ret =1;

	for(; n ; n = n >> 1){
		if(n & 1)//取最低位, 是不是很像判断奇偶
			ret = ret * base; //是1就乘
		base = base*base;     //base增增
	}

	return ret;
}
#define TO_INT(C) (C-'A'+1)
#define L(I) (TO_INT(choose[I]))

int calc(){
    return L(1)-_pow(L(2),2)+_pow(L(3),3)-_pow(L(4),4)+_pow(L(5),5);
}
void dfs(int dep){
    if( dep == 6){
        if( calc() == qua){
            is_get_ans = 1;
            memcpy(ans,choose,sizeof(ans));
        }

        return ;
    }
    int i;
    for(i=1;i<=len;i++){
        if( !vis[i]){
            choose[dep] = letters[i];
            vis[i] = 1;
            dfs(dep+1);
            vis[i] = 0;
        }
    }

}

int main(){
    while(1){

        scanf("%d",&qua);
        scanf("%s",letters+1);
        if( qua == 0)
            return 0;
        len = strlen(letters+1);
        sort(letters+1,letters+len+1);
        memset(vis,0,sizeof(vis));
        is_get_ans = 0;
        dfs(1);
        if( is_get_ans)
            printf("%s\n",ans+1);
        else
            printf("no solution\n");

    }

    return 0;
}

复杂度

总结