现在的位置: 首页 > 综合 > 正文

反素数 反素数

2017年11月04日 ⁄ 综合 ⁄ 共 1539字 ⁄ 字号 评论关闭
 

反素数

分类: 数论 56人阅读 评论(0) 收藏 举报

反素数

定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

性质一:一个反素数的质因子必然是从2开始连续的质数.

性质二:p=2^t1*3^t2*5^t3*7^t4.....必然t1>=t2>=t3>=....

 

题目1:Number With The Given Amount Of Divisors

题意:给一个数n,求一个最小的x,使得x的约数 个数为n。

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4. typedef long long LL;  
  5.   
  6. LL p[]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};  
  7. LL ans;  
  8. LL N;  
  9.   
  10. void dfs(LL i,LL x,LL n)  
  11. {  
  12.     if(n>N) return;  
  13.     if(n==N&&ans>x) ans=x;  
  14.     for(int k=1;k<=60;k++)  
  15.     {  
  16.         if(ans/p[i]<x) break;  
  17.         dfs(i+1,x*=p[i],n*(k+1));  
  18.     }  
  19. }  
  20.   
  21. int main()  
  22. {  
  23.     while(cin>>N)  
  24.     {  
  25.         ans=5e18;  
  26.         dfs(0,1,1);  
  27.         cout<<ans<<endl;  
  28.     }  
  29.     return 0;  
  30. }  

题目2:More Divisors

题意:求n以内的数,该数的因子数最多,就是要求n以内的最大反素数x。

证明:

在x以内,g(x)最大,在大于x小于n之间不存在因子数大于g(x)的数。

假设存在p,使g(p)>g(x),则p就是n以内的最大反素数,与x使最大反素数矛盾,顾不存在p。

  1. #include <stdio.h>  
  2. #include <iostream>  
  3.   
  4. typedef long long LL;  
  5. int prime[14]={2,3,5,7,11,13,17,19,23,29,31,37,41,43};  
  6. LL max,best;  
  7. LL n;  
  8.   
  9. void dfs(LL num,int k,LL sum,int limit)  
  10. {  
  11.     LL temp;  
  12.     if(sum>max)  
  13.     {  
  14.         max=sum;  
  15.         best=num;  
  16.     }  
  17.     if(sum==max&&best>num) best=num;  
  18.     if(k>=14) return;  
  19.     temp=num;  
  20.     for(int i=1;i<=limit;i++)  
  21.     {  
  22.         if(temp*prime[k]>n) break;  
  23.         temp*=prime[k];  
  24.         dfs(temp,k+1,sum*(i+1),i);  
  25.     }  
  26. }  
  27.   
  28. int main()  
  29. {  
  30.     while(std::cin>>n)  
  31.     {  
  32.         dfs(1,0,1,50);  
  33.         std::cout<<best<<std::endl;  
  34.     }  
  35.     return 0;  
  36. }  

抱歉!评论已关闭.