BZOJ 1053 HAOI2007 反素数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ 1053 HAOI2007 反素数相关的知识,希望对你有一定的参考价值。

 

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 反素数的主要内容,如果未能解决你的问题,请参考以下文章

bzoj1053 [HAOI2007]反素数ant

BZOJ 1053[HAOI2007]反素数ant

BZOJ 1053 HAOI2007 反素数

BZOJ1053 [HAOI2007]反素数ant 数论

bzoj1053: [HAOI2007]反素数ant

bzoj1053: [HAOI2007]反素数ant