HDU 5223 GCD

分析:对于q个问题中,在数组ans的每个区间a[i],到b[i]之间的最大公约数是c[i],所以取ans[i]为ans[i]和c[i]的最小公倍数。之后还要在对q个问题的答案检验一遍。

# include <stdio.h>
  __int64 gcd(__int64 a,__int64 b)
  {
      return b==0 ? a:gcd(b,a%b);
  }
  __int64 lcm(__int64 a,__int64 b)
  {
      return a*b/gcd(a,b);
  }
  int main()
  {
      int i,j,k,n,q,t,a[1010],b[1010],c[1010];
	  __int64 ans[1010];
      scanf("%d",&t);
      while(t--)
      {
          scanf("%d%d",&n,&q);
          for(i=1;i<=n;i++)
              ans[i]=1;
          for(i=1;i<=q;i++)
          {
              scanf("%d%d%d",&a[i],&b[i],&c[i]);
              for(j=a[i];j<=b[i];j++)
                  ans[j]=lcm(ans[j],c[i]);
          }
          for(i=1;i<=q;i++)
          {
              k=ans[a[i]];
              for(j=a[i]+1;j<=b[i];j++)
                  k=gcd(k,ans[j]);
              if(k!=c[i])
                  break;
          }
          if(i<=q)
              printf("Stupid BrotherK!\n");
          else
          {
              for(i=1;i<n;i++)
                  printf("%I64d ",ans[i]);
              printf("%I64d\n",ans[i]);
          }
      }
      return 0;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值