ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

D. Almost All Divisors(数学分解因子)

2020-05-02 11:06:26  阅读:270  来源: 互联网

标签:prime Almost ll int 因子 Divisors 除数 he


其实这题并不难啊,但是分解因子的细节一定要小心。

\(比如样例48,2是因子说明24也是因子,也就是说假如x存在\)

\(那么x一定是因子中的最小数乘上最大数\)

\(那我们现在去验证x是否存在,先拿x去整除除数表,看看是否所有除数都是x的因子\)

\(然后再去判断x的因子个数是不是等于n(确保除数表包含所有因子)\)

\(考虑到d_i<=1e6,极端情况下x=1e12(我并不确定这种情况存在)\)

\(所以我们不一个一个判断sqrt(x)内的数是否是因子,而是采取短除法\)

ll x=zu,num=0,he=1;
for(int i=1;i<=cnt;i++)//用prime[]中的质数筛选 
{
	num=0;
	if(x%prime[i]==0)
	{
		while(x%prime[i]==0)	num++,x/=prime[i];
		he*=(num+1);//包含num+1个prime[i]因子 
	}
}
if(x>1)	he*=2;

\(比如说48=2^4*3^1,所以组合数学嘛,从2因子可以拿0,1,2,3,4个因子,有5种可能\)

\(从3因子可以拿0,1个因子两种可能,也就是总共5*2=10个因子\)

\(因为我们不能一个都不拿或者全部都拿(除数表不包括1和x),所以是10-2=8个因子\)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+9;
ll t,n,a[301];
int prime[100009],cnt;
bool vis[maxn+10];
void make_prime()
{
	for(int i=2;i<=maxn;i++)
	{
		if(!vis[i])	prime[++cnt]=i;
		for(int j=1;j<=cnt&&i*prime[j]<=maxn;j++)
		{
			vis[i*prime[j]]=1;
			if(i%prime[j]==0)	break;
		}
	}
}
int main()
{
	cin>>t;
	make_prime();
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)	cin>>a[i];
		sort(a+1,a+1+n);
		if(n>=2)
		{
			ll zu=a[1]*a[n],flag=1;
			for(int i=2;i<=(n+1)/2;i++)//考虑奇数中间的数,所以(n+1)/2 
			{
				if(a[i]*a[n-i+1]==zu)	continue;
				flag=0;
				break;
			}
			if(flag==0)	cout<<-1;
			else
			{
				//判断zu有多少个因子
				ll x=zu,num=0,he=1;
				for(int i=1;i<=cnt;i++)//用prime[]中的质数筛选 
				{
					num=0;
					if(x%prime[i]==0)
					{
						while(x%prime[i]==0)	num++,x/=prime[i];
						he*=(num+1);//包含num+1个prime[i]因子 
					}
				}
				if(x>1)	he*=2;
				ll ans=0;
				if(he-2==n) 	cout<<zu;
				else	cout<<-1;
			}
		}
		else
		{
			if(vis[a[1]])	cout<<-1;
			else	cout<<a[1]*a[1];
		}
		cout<<endl;
	}
}

标签:prime,Almost,ll,int,因子,Divisors,除数,he
来源: https://www.cnblogs.com/iss-ue/p/12817328.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有