zoj 2562 反素数
2013-08-07 22:36
423 查看
题目大意:求n范围内最大的反素数(反素数定义:f(x)表示x的因子数,f(x)>f(x1) (0<x1<x))
x用质因数形式为:x=a1^p1*a2^p2......an^pn(ai为素数),那么一个数的因子个数f(x)=(p1+1)*(p2+1)*....*(pn+1)
反素数的性质有:x=a1^p1*a2^p2......an^pn,p1>=p2>=......>=pn
证明:若pi<pj(i<j),那么存在与它因子个数相等的x1且x1<x,与反素数的定义矛盾。
前十四个素数每个素数用一次的乘积已经大于10^16,所以枚举前十四个素数就可以了。
x用质因数形式为:x=a1^p1*a2^p2......an^pn(ai为素数),那么一个数的因子个数f(x)=(p1+1)*(p2+1)*....*(pn+1)
反素数的性质有:x=a1^p1*a2^p2......an^pn,p1>=p2>=......>=pn
证明:若pi<pj(i<j),那么存在与它因子个数相等的x1且x1<x,与反素数的定义矛盾。
前十四个素数每个素数用一次的乘积已经大于10^16,所以枚举前十四个素数就可以了。
#include<iostream> #include<cstdio> using namespace std; typedef long long LL; int prime[15]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47}; LL n,ans,Max; void dfs(LL sum,LL num,LL k,LL t) { if(sum>Max) {Max=sum;ans=num;} if(sum==Max && num<ans) ans=num; if(k>14) return ; LL temp=num; for(int i=1;i<=t;i++) { if(temp*prime[k]>n) break; temp*=prime[k]; dfs(sum*(i+1),temp,k+1,i); } } int main() { while(~scanf("%lld",&n)) { ans=n;Max=0; dfs(1,1,0,50); printf("%lld\n",ans); } return 0; }
相关文章推荐
- ZOJ 2562 反素数
- ZOJ 2562 反素数
- 反素数应用 ZOJ 2562 More Divisors + Timus OJ 1748. The Most Complex Number
- zoj 2562 More Divisors 反素数
- 【zoj2562】反素数
- 反素数的应用 hdu4228 zoj2562
- More Divisors ZOJ - 2562 反素数
- ZOJ Problem Set - 2562 More Divisors 反素数
- ZOJ 2562 HDU 4228 反素数
- ZOJ- 2562 反素数使用
- ZOJ 2562 反素数
- zoj2562 反素数
- zoj3707 斐波那契素数
- ZOJ-#3529 A Game Between Alice and Bob(Nim和+素数因子)
- ZOJ Problem Set - 3758 素数
- ZOJ 2562 数论+搜索
- zoj 2562
- 【ZOJ 1562和 BZOJ 1053】【反素数】【求n以内的因子最多的那个数(即不超过n的最大反素数)】
- ZOJ Problem Set - 3758 素数
- zoj_2723 Semi-Prime 半素数