BZOJ 1053 [HAOI2007]反素数ant 搜索
2013-03-12 23:55
483 查看
爆搜啊~
利用约数个数公式求答案。
相当于找约数最多的数,个数相同取较小的。
有一点需要注意:分解质因数,较小的数的指数一定大于等于较大的数的指数(显然的么~要么把大的数换成小的一定更优~)
这样一来,可以确定质因数最多十个,剩下就是暴力了~
View Code
利用约数个数公式求答案。
相当于找约数最多的数,个数相同取较小的。
有一点需要注意:分解质因数,较小的数的指数一定大于等于较大的数的指数(显然的么~要么把大的数换成小的一定更优~)
这样一来,可以确定质因数最多十个,剩下就是暴力了~
View Code
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> using namespace std; long long prime[14]={0,2,3,5,7,11,13,17,19,23,29,31,37}; long long ans,num,n; inline void dfs(int now,long long product,long long cs,long long lastcs,long long res) //当前数,当前乘积,当前数出现次数,上一个数出现次数,约数个数 { //printf("%d %lld %d %d %d\n",now,product,cs,lastcs,res); if(ans==res*(cs+1)&&product<num) num=product; if(res*(cs+1)>ans) {ans=res*(cs+1);num=product;} if(cs+1<=lastcs&&product*prime[now]<=n) dfs(now,product*prime[now],cs+1,lastcs,res); for(int i=now+1;i<=12;i++) if(product*prime[i]<=n) dfs(i,product*prime[i],1,cs,res*(cs+1)); } inline void go() { dfs(1,1,0,100,1); printf("%lld\n",num); } int main() { scanf("%lld",&n); go(); return 0; }
相关文章推荐
- [BZOJ 1053][HAOI2007]反素数ant:搜索
- bzoj 1053: [HAOI2007]反素数ant 搜索
- 【BZOJ1053】【HAOI2007】反素数ant 打表。/搜索
- [BZOJ 1053] [HAOI2007]反素数ant 数论+搜索
- BZOJ 1053: [HAOI2007]反素数ant
- bzoj 1053 [HAOI2007] 反素数 ant 题解
- bzoj 1053: [HAOI2007]反素数ant (数论)
- BZOJ 1053: [HAOI2007]反素数ant
- 【BZOJ 1053】[HAOI2007]反素数ant
- 【BZOJ1053】[HAOI2007]反素数ant 暴力
- bzoj1053 [HAOI2007] 反素数ant
- bzoj1053 [HAOI2007]反素数ant
- 【BZOJ 1053】[HAOI2007]反素数ant
- 【HAOI 2007】【BZOJ 1053】反素数ant
- [dfs] BZOJ1053: [HAOI2007]反素数ant
- bzoj1053 [HAOI2007]反素数ant
- BZOJ 1053 [HAOI2007]反素数ant
- [BZOJ 1053][HAOI2007]反素数ant
- BZOJ 1053 [HAOI2007]反素数ant(约数个数)
- bzoj 1053: [HAOI2007]反素数ant