CF 1165D Almost All Divisors 水

http://codeforces.com/contest/1165/problem/D

大意:

输入次数,对于每次,输入n,后跟n个数,求他们的最小公倍数,然后判断之前的n个数是不是它所有的乘数

思路:

1.最小公倍数就是最小乘最大(排序,ans=a[0]*a[n-1])

2.对剩余的a[2] to a[n-2],用ans和他们取模判断a[]是否为ans的乘数,如果出现不是乘数的,输出-1

3.求ans的乘数有几个,如果乘数个数不等于n,输出-1

避坑:注意int和 long long 的使用(惨痛的教训)

附源码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
	long long a[310];
	int times,n;
	cin>>times;
	while(times--)
	{
		long long ans;
		int flag=0;
		cin>>n;
		//in put 
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
		}
		//get ans
		sort(a,a+n);
		ans=a[0]*a[n-1];
		//check 1
		for(int i=1;i<n-1;i++)
		{
			if(ans%a[i]!=0)
			{
				flag=1;
				break;
			}
		}
		//check2
		int num=0; 
		long long lim=sqrt(ans);//!!!!  long long !!!!
		if(flag==0)
		{
			for(int i=2;i<=lim;i++)
			{
				if(ans%i==0)
				{
					num=num+2;
				}
			}
			if(lim*lim==ans)    
			{
				num--;
			}
			if(num!=n)
			{
				flag=1;
			}
		}
		if(flag==1)cout<<"-1"<<endl;
		else cout<<ans<<endl;
	}
	
	
}

猜你喜欢

转载自blog.csdn.net/recluse_e/article/details/90812578