CodeForce 27E

嘛。。一开始想的是把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);
	}
}


当然我是这么理解的啦。。既然和八皇后用的都是搜索的办法的话,那么应该能够抽象成一张图,因此其从某种方面上说,在更加深层次的地方,肯定有相似之处

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值