恰好有N个因子的最小正整数M

#include <cstdio>
#include <algorithm>
#include <cmath>K

int tmp[1000], cnt, rec[1000];
int prime[30] = {0, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 39, 41, 43, 47};
double ans, LOG[30];

void DFS(int pos, int val, int MAX, double clog) {
    if (clog > ans) return;
    if (val == 1) {
        cnt = pos;
        ans = clog;
        for (int i = 1; i < pos; i++)
            rec[i] = tmp[i];
        return;
    }

    for (int i = 1; i * i <= val && i <= MAX; i++) {
        if (val % i == 0) {
            if (i != 1) {
                tmp[pos] = i;
                DFS(pos+1, val/i, i, clog + LOG[pos] * (i-1));
            }
            if (val / i <= MAX && val / i != i) {
                tmp[pos] = val/i;
                DFS(pos+1, i, val/i, clog + LOG[pos] * (val/i - 1));
            }
        }
    }
}

int main() {
    int N;
    for (int i = 0; i < 16; i++)
        LOG[i] = log((double)prime[i]);
    while (scanf("%d", &N) != EOF) {
        ans = 0x3f3f3f3f;
        DFS(1, N, N, 0);
        long long M = 1;
        for (int i = 1; i < cnt; i++)
            for (int j = 1; j < rec[i]; j++)
                M *= prime[i];
        printf("%lld\n", M);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-18 19:58:54

恰好有N个因子的最小正整数M的相关文章

求含有n个因子的最小正整数(n&lt;=1000000)

题目链接:https://ac.nowcoder.com/acm/contest/331/G 思路: 根据唯一分解定理,如果一个数n可以表示成 n=p1a1*p2a2*...*pkak (pi是第i个质数) 那么n的因数的个数为(a1+1)*(a2+1)*...*(ak+1). 这题可以先打表. 代码如下: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<algorithm

26.一个正整数如果恰好等于它的因子之和,这个数称为“完数”,如6=1+2+3,求1000以内所有的完数.

?#include<iostream> using namespace std; int main() { for(int i=1;i<=1000;i++) { int sum=0; for(int j=1;j<i;j++) { if(i%j==0) { sum+=j; } } if(sum==i) { cout<<i<<" "<<endl; } } return 0; } 26.一个正整数如果恰好等于它的因子之和,这个数称为

一个数如果恰好等于它的因子之和,这个数就称为&quot;完数&quot;。 例如,6的因子为1、2、3,而6=1+2+3,因此6是&quot;完数&quot;。 编程序找出N之内的所有完数,

题目描述 一个数如果恰好等于它的因子之和,这个数就称为"完数". 例如,6的因子为1.2.3,而6=1+2+3,因此6是"完数". 编程序找出N之内的所有完数,并按下面格式输出其因子: 输入 N 输出 ? its factors are ? ? ? 样例输入 1000 样例输出 6 its factors are 1 2 3 28 its factors are 1 2 4 7 14 496 its factors are 1 2 4 8 16 31 62 124

[算法]数组中未出现的最小正整数

题目: 给定一个无序整型数组arr,找到数组中未出现的最小正整数. 例如: arr=[-1,2,3,4].返回1. arr=[1,2,3,4].返回5. 要求时间复杂度为O(N),空间复杂度为O(1). 解答: 在遍历arr之前先生成两个变量.变量l表示遍历到目前为止,数组arr已经包含的正整数范围是[1,l],所以在没有开始之前l=0,表示arr没有包含任何正整数.变量r表示遍历到目前为止,在后续出现最优状况的情况下,arr可能包含的正整数范围是[1,r],所以在没有开始之前,令r=N,r同时

题目:一个数如果恰好等于它的因子之和,这个数就称为 &quot;完数 &quot;。例如6=1+2+3.编程&#160;&#160;&#160;&#160; 找出1000以内的所有完数。

题目:一个数如果恰好等于它的因子之和,这个数就称为 "完数 ".例如6=1+2+3.编程     找出1000以内的所有完数. 1 package day11_2; 2 3 public class lianxi09 { 4 public static void main(String[] args) { 5 6 for (int i = 1; i < 1000; i++) { 7 int sum=0; 8 for (int j = 1; j <i; j++) { 9 10

数组中未出现的最小正整数

给定一个未排序的整数数组,让我们求得未出现的最小正整数(要求时间o(n)空间复杂度o(1)) 如果一般的方法,应该是先排序,然后遍历的时候直接找到正整数,但是排序最小也要o(n*log(n))的复杂度.这里运用了夹逼的办法(代码如下) 1 void swap(int &a,int &b) 2 { 3 int temp = a; 4 a = b; 5 b =temp; 6 7 8 } 9 int Number(int *arr,int size) 10 { 11 int r = size;

找出数组中从未出现的最小正整数java实现

1 /** 2 * 找出未出现的最小正整数 3 * @param A 4 * @param n 5 * @date 2016-10-7 6 * @author shaobn 7 */ 8 public static int findArrayMex(int[] a,int n){ 9 int count = n; 10 int temp = 0; 11 int dir = 1; 12 int num = 0; 13 for(int i = 0;i<count-1;i++){ 14 if(a[i]

最小正整数

有一个整数,除5余3.除3余2.除2余1,            求满足条件的最小正整数. 那么while(1)其中1代表一个常量表达式,他永远不会等于0.所以,循环会一直执行下去.除非你设置break等类似的跳出循环语句循环 才会中止 #include <iostream>using namespace std;int main( ){     int x=1;      while(1)      { if(x%5==3 && x%3==2 && x%2==

求最小正整数x,A^x=1(mod M)求阶模板

整数的阶:设a和n是互素的正整数,使得a^x=1(mod n)成立的最小的正整数x称为a模n的阶 //求阶模板:A^x=1(mod M),调用GetJie(A,M) //输入:10^10>A,M>1 //输出:无解返回-1,有解返回最小正整数x //复杂度:O(M^(0.5)) long long gcd(long long a,long long b) { if(b==0) return a; return gcd(b,a%b); } //欧拉函数:复杂度O(n^(0.5)),返回[1,n-