正题
评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P1463
题目大意
求1∼n1∼n中最大的一个约数个数比前面的所有数都要多的数。
解题思路
首先根据数据我们可以得知这个数的质因子不超过10个。而且这个数的质因子是连续若干个最小的质数,而且指数单调递增,因为这样的数可以保证每些质因子组成的他的约数都是最小的也是最多的。
所以我们就可以用搜索找出答案
code
#include<cstdio>
#include<algorithm>
using namespace std;
const long long prime[12]={2,3,5,7,11,13,17,19,23,29};
long long n,mark,maxs;
long long power(long long a,long long b)//快速幂
{long long sum=1;while(b){if(b&1) sum*=a;a*=a;b>>=1;}return sum;
}
void dfs(long long x,long long sum,long long maxc,long long num)
//深搜,参数分别表示第几个质数,目前质数乘积,目前最大指数,目前约数个数
{if(sum>n) return;if(num>maxs||(num==maxs&&sum<mark)){maxs=num;mark=sum;}//统计答案if(x>=12) return;long long v=0,pows;while((pows=power(prime[x],v))<=n&&v<=maxc)//没有爆炸而且指数递增{dfs(x+1,sum*pows,v,num*(v+1));//下一个v++;}
}
int main()
{scanf("%lld",&n);dfs(0,1,32,1);//开始搜索printf("%lld",mark);
}