BZOJ1053(HAOI2007)反素数ant--暴搜
2017-10-29 14:59
465 查看
【链接】
bzoj1053
【解题报告】
一个数可以拆分为若干个质因子相乘的形式
x=pa11∗pa22∗pa33∗...∗pann
易知一个数的因数个数为(a1+1)∗(a2+1)∗(a3+1)∗...∗(an+1)
因为小素数比大素数优。(因为因数个数只跟拆分的素数个数有关)。
所以只需要用前11个素数dfs就可以解决此题了。
bzoj1053
【解题报告】
一个数可以拆分为若干个质因子相乘的形式
x=pa11∗pa22∗pa33∗...∗pann
易知一个数的因数个数为(a1+1)∗(a2+1)∗(a3+1)∗...∗(an+1)
因为小素数比大素数优。(因为因数个数只跟拆分的素数个数有关)。
所以只需要用前11个素数dfs就可以解决此题了。
#include<cstdio> #include<cmath> #define LL long long using namespace std; const int a[12]={2,3,5,7,11,13,17,19,23,29,31}; int n,ans,num; inline char nc() { static char buf[100000],*l,*r; if (l==r) r=(l=buf)+fread(buf,1,100000,stdin); if (l==r) return EOF; return *l++; } inline int Read() { int res=0; char ch=nc(); while (ch<'0'||ch>'9') ch=nc(); while (ch>='0'&&ch<='9') res=res*10+ch-48,ch=nc(); return res; } void Dfs(int x,int now,int sum,int las) { if (x>11) { if (sum>num) ans=now,num=sum; if (now<ans&&sum==num) ans=now; return; } for (int i=0,p=1; i<=las; i++,p*=a[x]) { Dfs(x+1,now*p,sum*(i+1),i); if ((LL)now*p*a[x]>n) break; } } int main() { freopen("1053.in","r",stdin); freopen("1053.out","w",stdout); n=Read(); ans=num=0; Dfs(0,1,1,log2(n)); printf("%d",ans); return 0; }
相关文章推荐
- bzoj 1053: [HAOI2007]反素数ant && 51nod-1060:最复杂的数(反素数与因数个数计算)
- BZOJ 1053 [HAOI2007]反素数ant
- BZOJ 1053: [HAOI2007]反素数ant
- BZOJ 1053 [HAOI2007]反素数ant
- 1053: [HAOI2007]反素数ant - BZOJ
- [dfs] BZOJ1053: [HAOI2007]反素数ant
- 【BZOJ1053】【DFS】【打表】[HAOI2007]反素数ant 题解
- [BZOJ 1053] [HAOI 2007] 反素数ant
- [bzoj1053][HAOI2007]反素数ant
- [BZOJ 1053][HAOI2007]反素数ant:搜索
- 【bzoj1053】[HAOI2007]反素数ant(数论)
- BZOJ 1053: [HAOI2007]反素数ant
- 【结论+暴搜】BZOJ1053 [HAOI2007]反素数ant
- 【BZOJ 1053】 1053: [HAOI2007]反素数ant (反素数)
- bzoj1053 [HAOI2007] 反素数ant
- 【BZOJ】1053: [HAOI2007]反素数ant
- bzoj 1053 [HAOI2007] 反素数 ant 题解
- 【BZOJ 1053】[HAOI2007]反素数ant
- Bzoj1053 [HAOI2007]反素数ant
- bzoj 1053: [HAOI2007]反素数ant