[牛客竞赛] 炫酷数字(简单数学,素数)

链接:https://ac.nowcoder.com/acm/contest/331/G
来源:牛客网

题目描述

小希希望你构造一个最小的正整数,使得其有n个因子。

输入描述:

第一行一个整数T表示数据组数

每组数据第一行输入一个正整数n,表示其因子数。

n≤1,000,000

T≤1,000,000

输出描述:

输出一行一个整数,表示你构造出的这个数。注意:你需要保证你构造的数≤1,000,000,如果在这个范围里面无法构造出一个正整数满足条件,请输出-1。

示例1

输入

2
4
5

输出

6
16



分析:

利用类似埃氏筛选的方法,取一个数 i ,那么 i , 2i , 3i , 4i … 都含有因子 i ,所以令他们的因子数+1

因为 某数的因子 总小于等于 该数,所以通过这种方法就能得到前1.000,000个数的因子数



以下代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10; 
int main()
{                                      
	int min_num[maxn],num[maxn]={0};         //min_num[n]记录因子数为 n的最小数
	fill(min_num,min_num+maxn,INT_MAX);      //num[i]记录 i的因子数
	for(int i=1;i<=1000000;i++)
	{
		for(int j=i;j<=1000000;j+=i)
		{                     //j=i,2i,3i,4i...
			num[j]++;         //j都含有因子 i,所以 num[j]++
		}
	}
	for(int i=1;i<=1000000;i++)
	{                                       //再次从1遍历到1000000
		if(min_num[num[i]]==INT_MAX)        //这样得到的一定是最小数
			min_num[num[i]]=i;
	}
	
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		if(min_num[n]==INT_MAX)
			printf("-1\n");
		else
			printf("%d\n",min_num[n]);
	}
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值