码迷,mamicode.com
首页 > 其他好文 > 详细

HDU ACM 5223 GCD

时间:2015-05-11 09:07:24      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:c   c++   acm   算法   编程   

分析:先根据询问求出每个纵向区间的最小公倍数(一列算一个区间),在根据询问判断每个横向区间的最大公约数是否和询问相同,若都相同则输出最终结果,否则不存在。

技术分享

#include<iostream>
using namespace std;

int a[1005];
struct NODE
{
	int l,r,gcd;
} GCD[1005];

int gcd(int x,int y)
{
	return y==0?x:gcd(y,x%y);
}

int lcm(int x,int y)
{
	return x/gcd(x,y)*y;
}

int main()
{
	int T,N,Q,i,j,_gcd;
	bool ok;

	ios::sync_with_stdio(false);
	cin>>T;
	while(T--)
	{
		cin>>N>>Q;
		for(i=1;i<=N;i++) a[i]=1;
		for(i=0;i<Q;i++)
		{
			cin>>GCD[i].l>>GCD[i].r>>GCD[i].gcd;
			for(j=GCD[i].l;j<=GCD[i].r;j++)
				a[j]=lcm(a[j],GCD[i].gcd);      //求最小公倍数
		}
		ok=true;
		for(i=0;i<Q;i++)
		{
			_gcd=a[GCD[i].l];
			for(j=GCD[i].l+1;j<=GCD[i].r;j++)
				_gcd=gcd(_gcd,a[j]);

			if(_gcd!=GCD[i].gcd)
			{
				ok=false;
				break;
			}
		}
		if(!ok)
			cout<<"Stupid BrotherK!"<<endl;
		else
		{
			for(i=1;i<N;i++)
				cout<<a[i]<<" "; 
			cout<<a[i]<<endl;
		}
	}
    return 0;
}


HDU ACM 5223 GCD

标签:c   c++   acm   算法   编程   

原文地址:http://blog.csdn.net/a809146548/article/details/45623899

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!