当前位置: 首页 > 知识库问答 >
问题:

数个非素数对,当乘以一个给定的数N时,

苏彦君
2023-03-14

形成N的非素数对是2个不同的非素数,其中数的乘积是N。

1<=n<=10^6

共有1个答案

刘星火
2023-03-14

首先,Eratosthenes的筛子是O(N*log(log(N)),以列出所有低于或等于N的素数(当实现得很好时)。

第二:假设你将你的数分解为q素数,它具有多重性,不需要筛选,最坏的情况下是O(sqrt(N))的过程(最坏的情况是:你的数是素数)。因此您有一个地图:

  • P0->多重数M0
  • P1->多重数M1
  • ...
  • PQ->多重数MQ
    null

代码-Java

import java.util.HashMap;
import java.util.Map;

class Example {

  static void factor(long N, Map<Long, Short> primesWithMultiplicity) {
    // some arg checking and trivial cases
    if(N<0) N=-N;
    if(0==N) {
       throw new IllegalArgumentException(
         "Are you kidding me? Every number divides 0, "+
         "you really want them all listed?"
       );
    }
    if(1==N) {
      primesWithMultiplicity.put(1L,(short)1);
      return;
    }

     // don't try divisors higher than sqrt(N), 
    // if they would have been detected by their composite-complement 
    for(long div=2; div*div < N; ) {
      short multiplicity=0;
      while((N % div)==0) {
        multiplicity++;
        N /= div; // reduce N
      }
      if(multiplicity>0) {
        primesWithMultiplicity.put(div, multiplicity);
      }
      div+= (div == 2 ? 1 : 2); // from 2 to 3, but then going only on odd numbers
    }
    // done.. well almost, if N is prime, then 
    // trying to divide up to sqrt(N) will lead an empty result. But,
    // in this case, N will still be at original value (as opposed 
    // to being 1 if complete factored)
    if(N>1) {
      primesWithMultiplicity.put(N, (short)1);
    }
  }

  static int countDistinctCompositePairs(long N) {
    HashMap<Long, Short> factoringResults=new HashMap<>();
    factor(N, factoringResults);
    int ret=1;
    for(short multiplicity : factoringResults.values()) {
      ret*=multiplicity;
    }
    return ret/2;
  }

  static public void main(String[] args) {
    System.out.println(countDistinctCompositePairs(24));
  }
}
 类似资料:
  • 给定一个数N,我们如何求最大P*Q null 因此,暴力解决方案起作用。 再进一步,我们看到Q_max<=n/2,如果我们确实同意P =√n。 我们可以将我们的解决方案集细化为仅有那些值{P,n\2},其中n\2>=√N。 这可能看起来微不足道,但它只是消除了可能的解决方案集的1/3。 我们是否可以添加其他聪明的程序来进一步减少设置?

  • 本文向大家介绍C ++中给定乘积的N个整数的最大GCD,包括了C ++中给定乘积的N个整数的最大GCD的使用技巧和注意事项,需要的朋友参考一下 假设我们有两个整数N和P。P是N个未知整数的乘积。我们必须找到这些整数的最大可能GCD。假设N = 3,且P = 24,则不同的组将像{1,1,24},{1,2,12},{1,3,8},{1,4,6},{2 ,2,6},{2,3,4}。GCD为:1、1、1

  • 我正在研究CodeChef中的一个问题,我需要计算n个数字的阶乘。 用户输入一个数字,该数字确定要对多少整数执行阶乘计算,然后输入要计算的数字。 我的问题是乘法本身。例如,如果我有一个int==5,那么结果将是20(它将仅通过最后一个阶乘计算n,而不是所有阶乘) 这就是问题所在: 外部循环定义要执行的计算数量。 内部循环通过迭代numberToProcess的每个索引并将其乘以每个小于要计算的数字

  • 本文向大家介绍请写出一个函数求出N的阶乘(即N!)相关面试题,主要包含被问及请写出一个函数求出N的阶乘(即N!)时的应答技巧和注意事项,需要的朋友参考一下

  • 特殊数字是这样的,即在素数指数上有素数位(2,3,5,7),在非素数指数上有非素数值。(例如,15743-素数索引(2,3,5)具有素数数字(5,7,3))。有多少个n位的特殊数字也可以被m整除。 例如,对于n=2和m=2,答案将是[12,42,62,82,92],所以是5。 我写了一个回溯算法,找到特殊数的所有这些排列,然后检查这些特殊数中的每一个是否可以被m整除,并返回计数。这对n和m的小值有