码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1053 HAOI2007 反素数

时间:2017-09-08 20:39:40      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:dfs   大于   prime   lld   algorithm   暴力   原理   span   int   

 

1.
一个数的约数个数=所有素因子的幂次+1的乘积
这个直观的理解就是 2^x*3^y 我能拆出来 
2^0*3^0
2^0*3^1
2^0*3^2
……
2^1*3^0
2^1*3^1
……
2^2*3^0
……
2^x*3^0
……
2^x*3^y
根据乘法原理 2一共有x+1个幂 3有y+1个幂 所以就是(x+1)*(y+1)
 
2.
写一个暴力跑程序会发现一个2000000000以内的数字不会有超过12个素因子
 
3.
较小的数的幂次一定大于等于较大的数的幂次
 
之后就是赤裸裸的DFS暴搜了 

 1 #include <cstdio>
 2 #include <algorithm>
 3  
 4 typedef long long ll;
 5 ll n;
 6 int ans=1,num=1;
 7  
 8 ll Max,last;
 9 //1的确不是质数 但是x^0需要用到 
10 int prime[15]={1,2,3,5,7,11,13,17,19,29,31};
11  
12 void dfs(int dep,ll Num,int tot,int limit){
13     if(dep==12){
14         //当前值大于记录值  并且约数也比上次那个多 
15         if(Num > Max && tot> last){
16             Max = Num;
17             last = tot;
18         }
19         //当前值小于记录值  并且约数也比上次那个多  记录值不合法 
20         /*这里这个“= ”特别说明一下
21         g(x)>g(i) 0<i<x
22         当前的值是i 比 x 小满足条件,但是如果g(i)<g(x)或者 g(i)=g(x)都不合法 
23         */ 
24         if(Num <= Max && tot >= last){
25             Max = Num;
26             last = tot;
27         }
28         return;
29     }
30     int mul =  1;
31     for(int i=0;i<=limit;++i){
32         dfs(dep+1,Num*mul,tot*(i+1),i);
33         mul*=prime[dep];
34         if(Num*mul>n) break;
35     }
36 }
37  
38 int main(){
39     scanf("%d",&n);
40     dfs(1,1,1,20);
41     printf("%lld\n",Max);
42     return 0;
43 }

 

BZOJ 1053 HAOI2007 反素数

标签:dfs   大于   prime   lld   algorithm   暴力   原理   span   int   

原文地址:http://www.cnblogs.com/OIerLYF/p/7496020.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!