bzoj:1053 [POI2002][HAOI2007]反素数
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;
}//(^_^)
还是挺简单的嘛……