求含有n个因子的最小正整数(n<=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>
 5 using namespace std;
 6
 7 const int maxn=1e6+5;
 8 int t,n;
 9 int min_num[maxn],cnt[maxn];
10 int main(){
11     memset(min_num,-1,sizeof(min_num));
12     for(int i=1;i<maxn;i++)
13         for(int j=i;j<maxn;j+=i)
14             cnt[j]++;
15     for(int i=1;i<maxn;i++)
16         if(min_num[cnt[i]]==-1)
17             min_num[cnt[i]]=i;
18     scanf("%d",&t);
19     while(t--){
20         scanf("%d",&n);
21         printf("%d\n",min_num[n]);
22     }
23     return 0;
24 }

原文地址:https://www.cnblogs.com/FrankChen831X/p/10345719.html

时间: 2025-01-01 08:38:42

求含有n个因子的最小正整数(n<=1000000)的相关文章

恰好有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

求最小正整数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-

求无序数组中未出现的最小正整数

给定一个无序整型数组arr,找到数组中未出现的最小正整数.要求时间复杂度为O(N),空间复杂度为常数级. 例如: arr=[33,33,33,33]  返回1 arr=[34,56,45,12]  返回1 arr=[-1,2,3,4]  返回1 arr=[1,2,3,4]   返回5 ... 随便什么都行 原理很简单,代码用数据跑一遍就看出思想了. 1 #include<iostream> 2 #include<fstream> 3 using namespace std; 4 i

Acdream1084 寒假安排 求n!中v因子个数

题目链接:点击打开链接 寒假安排 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 128000/64000 KB (Java/Others) SubmitStatistic Next Problem Problem Description 寒假又快要到了,不过对于lzx来说,头疼的事又来了,因为众多的后宫都指望着能和lzx约会呢,lzx得安排好计划才行. 假设lzx的后宫团有n个人,寒假共有m天,而每天只能跟一位后宫MM约会,并且由于后宫

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

给定一个未排序的整数数组,让我们求得未出现的最小正整数(要求时间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;

最小正整数

有一个整数,除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==

[算法]请用A中元素组成一个大于k的最小正整数

给定A[]={0,1,3,8},A是U={0,1,2,3,4,5,6,7,8,9}的子集,k是正整数,请用A中的元素组成一个大于k的最小正整数. 思路: 1.使用flag数组标记A中的元素, bool flag[10]; 顺便记录A中的最小元素 bool flag[10] = {0,0,0,0,0,0,0,0,0,0}; int min = 10; for(int i = 0; i < n; ++i){ flag[a[i]] = true; min = min < a[i] ? min : a

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

题目: 给定一个无序整型数组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同时

找出数组中从未出现的最小正整数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]