• More Divisors zoj 2562


    反素数

    问题描述:

    对于任何正整数x,起约数的个数记做g(x).例如g(1)=1,g(6)=4.

    如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数.

    现在给一个N,求出不超过N的最大的反素数.

    比如:输入1000  输出 840

    思维过程:

    求[1..N]中约数在大的反素数-->求约数最多的数

    如果求约数的个数 756=2^2*3^3*7^1

    (2+1)*(3+1)*(1+1)=24

    基于上述结论,给出算法:按照质因数大小递增顺序搜索每一个质因子,枚举每一个质因子

    为了剪枝:

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

    因为最多只需要10个素数构造:2,3,5,7,11,13,17,19,23,29

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

    void make(long long num,long long k,long long sum,int limit)

    //当前枚举到的数;枚举到的第K大的质因子;该数的约数个数;质因子个数上限。
    v{
    v  int i;
    v  long long temp;
    v  if (sum>maxsum)
    v  {
    v    maxsum=sum;
    v    bestnum=num;  //如果约数个数更多,将最优解更新为当前数。
    v  }
    v  if (sum==maxsum && bestnum>num)
    v    bestnum=num;  //如果约数个数相同,将最优解更新为较小的数。
    v   
    v  if (k>10)return;
    v 
    v  temp=num;
    v  for(i=1;i<=limit;i++)  //开始枚举每个质因子的个数。
    v  {
    v    if (temp*prime[k]>n)
    v      break;
    v    temp=temp*prime[k];  //累乘到当前数。
    v    make(temp,k+1,sum*(i+1),i); //继续下一步搜索。
    v  }
    v}

    v

    //当前枚举到的数;枚举到的第K大的质因子;该数的约数个数;质因子个数上限。
    v{
    v  int i;
    v  long long temp;
    v  if (sum>maxsum)
    v  {
    v    maxsum=sum;
    v    bestnum=num;  //如果约数个数更多,将最优解更新为当前数。
    v  }
    v  if (sum==maxsum && bestnum>num)
    v    bestnum=num;  //如果约数个数相同,将最优解更新为较小的数。
    v   
    v  if (k>10)return;
    v 
    v  temp=num;
    v  for(i=1;i<=limit;i++)  //开始枚举每个质因子的个数。
    v  {
    v    if (temp*prime[k]>n)
    v      break;
    v    temp=temp*prime[k];  //累乘到当前数。
    v    make(temp,k+1,sum*(i+1),i); //继续下一步搜索。
    v  }
    v
    }
     
     
    #include<stdio.h>
    #include<string.h>
    #define LL long long
    int prime[15] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47 };
    LL bestnum, bestsum, n;
    void bfs(LL currentnum, LL currentsum, int k, int lever) {
    	if (currentsum > bestsum) {
    		bestsum = currentsum, bestnum = currentnum;
    	}
    	if (currentsum == bestsum && bestnum > currentnum) {
    		bestnum = currentnum;
    	}
    	if (k > 14) {
    		return;
    	}
    	LL temp;
    	int i;
    	temp = currentnum;
    	for (i = 1; i <= lever; i++) {
    		if (temp * prime[k] > n) {
    			break;
    		}
    		temp = temp * prime[k];
    		bfs(temp, currentsum * (i + 1), k + 1, i);
    	}
    }
    int main() {
    #ifndef ONLINE_JUDGE
    	freopen("t.txt", "r", stdin);
    #endif
    	while (scanf("%lld", &n) != EOF) {
    		bestsum = 0, bestnum = n;
    		bfs(1, 1, 0, 50);
    		printf("%lld\n", bestnum);
    	}
    	return 0;
    }
    
  • 相关阅读:
    What's New in Chrome DevTools All In One
    User Timing API All In One
    Tailwind CSS All In One
    CSS 3D rotate with mouse move All In One
    Event Timing API All In One
    Long Tasks API All In One
    js get window custom global variables All In One
    Web 前端广告落地页性能监控系统 All In One
    Element Timing API All In One
    base64编码
  • 原文地址:https://www.cnblogs.com/xiaoxian1369/p/2129031.html
Copyright © 2020-2023  润新知