bzoj:1053 [POI2002][HAOI2007]反素数

版权声明:蒟蒻写文章不容易啊,各位大佬转载要告诉我一声,QAQ https://blog.csdn.net/qq_38944163/article/details/83544802

luogu:https://www.luogu.org/problemnew/show/P1463

这题的本质就是求约数最多的数最小是多少。

就直接枚举每个质数的指数就行了

然后前10个质数的乘积是大于2*10^9,然后加两个约束就行了

约束

1、第i+1个质数的指数一定不会比第i个质数的指数的大

2、只用枚举10个质数

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int prime[15] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31}, a[15];
int n, anss;
ll ans;
//p  :当前是第几个质数
//pr : 当前质数的指数
//sum :当前所有数的乘积和
//ysh :当前所有数的约束和
//limit:上一个质数的指数(约束1)
void dfs(int p, int pr, ll sum, int ysh, int limit){
	if(pr > limit) return;//约束1
	if(anss < ysh || anss == ysh && ans > sum){//按题目要求更新答案
		ans = sum;
		anss = ysh;
	}
	if(p > 10) return;//约束2
	if(sum * prime[p] <= n) dfs(p, pr + 1, sum * prime[p], ysh + a[p - 1], limit); //当前质数的指数加1,学过一点点奥数的都知道ysh是如何更新的
	a[p] = ysh;
	dfs(p + 1, 0, sum, ysh, pr);//到下一个质数
}
int main(){
	a[0] = 1;
	scanf("%d", &n);
	dfs(1, 0, 1, 1, (1<<30));
	printf("%lld", ans);//输出
	return 0;
}//(^_^)

还是挺简单的嘛……

猜你喜欢

转载自blog.csdn.net/qq_38944163/article/details/83544802