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