HDU 5317 RGCDQ

分析:F(x)就是x有几个不同的质因数,比如210=2*3*5*7,所以F(210)=4,让你求区间[l,r]内最大的GCD(F(i),F(j)),(l<=i<j<=r)。注意到2<=l<r<=1000000,2*3*5*7*11*13*17=510510,2*3*5*7*11*13*17*19=9699690>1000000,所以F(x)<=7,而F(x)=7就只有8个可以单独处理。

# include <stdio.h>
# include <string.h>
  int count,prime[1000];
  int f[1000010],a[1000010];
  int F(int n)
  {
      int i,ans=0;
      for(i=0;i<count;i++)
      {
          if(n==1)
            return ans;
          if(!a[n])
            return ans+1;
          if(n%prime[i]==0)
          {
              ans++;
              while(n%prime[i]==0)
                n=n/prime[i];
          }
      }
  }
  int main()
  {
      int i,j,t,l,r,num,ans[10],seven[8]={510510,570570,690690,746130,870870,881790,903210,930930};
      memset(a,0,sizeof(a));a[0]=1;
      for(i=2;i<=1000000;i++)//求2到1000000之间的质数
      {
          if(!a[i])
            for(j=2*i;j<=1000000;j+=i)
              a[j]=1;
      }
      for(i=2,count=0;i<=1000;i++)
        if(!a[i])//a[i]=0为质数
          prime[count++]=i;
      for(i=2;i<=1000000;i++)
        f[i]=F(i);
      scanf("%d",&t);
      while(t--)
      {
          memset(ans,0,sizeof(ans));
          scanf("%d%d",&l,&r);
          for(i=0,num=0;i<8;i++)
            if(l<=seven[i]&&seven[i]<=r)
              num++;
          if(num>=2)
            printf("7\n");
          else
          {
              for(i=r;i>=l;i--)
              {
                  ans[f[i]]++;
                  if(ans[6]>=2)
                    break;
              }
              for(i=6;i>=2;i--)
                if(ans[i]>=2)
                  break;
              if(i>=2)
                printf("%d\n",i);
              else
              {
                  num=0;
                  if(ans[2]==1) num++;
                  if(ans[4]==1) num++;
                  if(ans[6]==1) num++;
                  if(num>=2)
                    printf("2\n");
                  else
                    printf("1\n");
              }
          }
      }
      return 0;
  }



你可能感兴趣的:(ACM)