题目:
http://acm.hdu.edu.cn/showproblem.php?pid=5223
题意:
已知一个序列若干区间内数字的最大公约数,问是否能复原出原序列,输出最小满足条件的序列
思路:
初始设序列上所有数字均为1,对每个区间上每个数字,变成原数字与公约数的最小公倍数,最后再检查一次结果序列每个区间是否满足
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
const int limit=1000000000;
struct ques{
int l,r,ans;
};
ques question[1005];
long long int num[1005];
long long gcd(long long int a,long long int b){
if (a%b==0) return b;
else return gcd(b,a%b);
}
long long int lcm(long long int a,long long int b){
return a*b/gcd(a,b);
}
int main(){
int total;cin>>total;
while (total--){
int n,q;
bool c=true;
cin>>n>>q;
for (int i=1;i<=n;++i) num[i]=1;
for (int i=1;i<=q;++i){
//cin>>question[i].l>>question[i].r>>question[i].ans;
scanf("%d%d%d",&question[i].l,&question[i].r,&question[i].ans);
for (int j=question[i].l;j<=question[i].r;++j){
num[j]=lcm(num[j],question[i].ans);
if (num[j]>limit) c=false;
}
}
//for (int i=1;i<=n;++i) cout<<num[i]<<" "; cout<<endl;
if (!c){
cout<<"Stupid BrotherK!"<<endl;
continue;
}
else{
for (int i=1;i<=q && c;++i){
int g=num[question[i].l];
for (int j=question[i].l+1;j<=question[i].r;++j){
g=gcd(g,num[j]);
}
if (g!=question[i].ans) c=false;
}
if (!c){
cout<<"Stupid BrotherK!"<<endl;
continue;
}
else{
for (int i=1;i<=n;++i){
cout<<num[i];
if (i!=n) cout<<" ";
}
cout<<endl;
}
}
}
return 0;
}