嘛。。一开始想的是把n分解质因数,然后对应算数基本定理去找素数,但是猛然醒悟这不对。
转而使用搜索。。。在思考的过程中,我觉得,和八皇后好像呀!当然有点区别就是了,八皇后是计数,这个仅仅是找到值,先抛开问题不管。。
八皇后的一个步骤是判断一个局面是否满足了要求,为了和八皇后接轨,我们在这个题目也来弄一个棋盘好了。
这个棋盘呢,一共有64列,因为10^18<2^64,一共有16行,因为前16个素数相乘>10^18,棋盘大概就是这个样子
1 2 3 4 5 6 .......... 64
2
3
5
7
11
.....
53
我们首先从最左上角开始放,就像八皇后那样,这儿的横坐标代表底数,纵坐标代表指数,放在第一格就代表用算数基本定理分解出来之后有2^1这个项,放在第二格即代表有2^2这个项,我们还可以轻易的看出,A行,B行(A<B),那么在B行放置的点一定在A行放置的点的左边或者同一列,否则我们就可以把这两列互换拿到更小的数。
然后就想八皇后那样判断条件即可,用一个数记录当前的最小值,不满足条件的情况是因数>所给的数或者是大于当前的最小值都是不符合规则的,最后输出这个最小值即可
#include<iostream>
#include<climits>
using namespace std;
int prime[]{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
int n;
unsigned long long ans = ULLONG_MAX;
void calc(unsigned long long value,int divisor_num, int pos,int up);
int main(){
while (cin>>n){
calc(1, 1, 0, 64);
cout << ans << endl;
ans = ULLONG_MAX;
}
return 0;
}
void calc(unsigned long long value, int divisor_num, int pos, int up){
if (divisor_num > n)return;
if (divisor_num == n&&value < ans){
ans = value;
return;
}
for (int i = 1; i <= up; ++i){
value *= prime[pos];
if (value>ans)
return;
calc(value, divisor_num*(i + 1), pos + 1, i);
}
}
当然我是这么理解的啦。。既然和八皇后用的都是搜索的办法的话,那么应该能够抽象成一张图,因此其从某种方面上说,在更加深层次的地方,肯定有相似之处