反素数解析

反素数的定义:

 对于任何正整数,其约数个数记为,例如,如果某个正整数满足:对任意的正整

   数,都有,那么称为反素数。

或者:             

    一个[1,n]的连续区间, 约数相同的最小数x,x是反素数。例如:f(6) = 4,f(8) = 4,6是约数为4切最小的数,所以6是约数。

 

反素数性质:

  1. 反素数肯定是从2开始的连续素数的幂次形式的乘积。
  2. 数值小的素数的幂次大于等于数值大的素数,即n = p_{1}^{k_{1}}*p_{2}^{k_{2}}*p_{3}^{k_{3}}*...*p_{n-1}^{k_{n-1}}*p_{n}^{k_{n}}中,有k_{1}\geq k_{2}\geq k_{3}\geq ...\geq k_{n}

 

性质的解析:

  根据 反素数定义:

  对于性质二: (5^6)*(7^2)*(11^7) > (5^7)*(7^6)*(11^2)

  对于性质一:(5^7)*(7^6)*(11^2) > (2^7)*(3^6)*(5^2)

 

例题:反素数模板题

我们先求出这个区间最多由几个素数相乘,即n = p_{1}^{k_{1}}*p_{2}^{k_{2}}*p_{3}^{k_{3}}*...*p_{n-1}^{k_{n-1}}*p_{n}^{k_{n}},(k1 = k2  = k3 = ... = kn , kn = 1)

我们再求出这个区间的最大数最多是最小素数的几次幂。 2e9 < 2^30。

 1 #include <iostream>
 2 #include <cstdio>
 3 #define ll long long
 4 
 5 using namespace std; 
 6 
 7 int p[] = {2,3,5,7,11,13,17,19,23,29};
 8 int Max,ans,n;
 9  
10 // inx 素数下标  v当前数值  cnt 约数个数  pw之前的幂次
11 void dfs(int inx, int v, int cnt, int pw){
12 
13     for(int i = 1; i <= pw; ++i){
14         if((ll)v * p[inx] > (ll)n){
15             if(Max < cnt * i){
16                 Max = cnt * i;
17                 ans = v;
18                 
19             }else if(cnt * i == Max) ans = min(ans, v);
20             break;
21         }
22         else dfs(inx + 1, v *= p[inx], cnt * (i + 1), i);
23 
24     }
25 }
26  
27  
28 int main(){
29 
30     while(~scanf("%d", &n)){
31         Max = 1;
32         dfs(0, 1, 1, 30);   
33         printf("%d\n", ans);
34     }
35 
36     return 0;
37 }
38  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值