每日一道思维题——CF1538D - Another Problem About Dividing Numbers

题意:

给定一个整数t,有t组数据,对于每组数据,有整数a,b,k。求能否通过共k步的整除使a,b变成一样的数

思路:

本题可以转换为求a可以由多少个整数构成(x1个),b由多少个整数构成(x2个),判断x1+x2与k的关系

大于等于时YES,小于时NO

AC代码如下:

#include<iostream>
using namespace std;
int cou_gcd(int x)
{
  int sum = 0;

  for(int i = 2; i*i <= x; i++)
  {
    while(x%i==0)
    {
      sum++;
      x/=i;
    }
  }

  if(x > 1) 
    sum++;

  return sum;
}

int main()
{
  int t;
  scanf("%d", &t);

  while(t--)
  {
    int a, b, k;
    scanf("%d%d%d", &a, &b, &k);
    int x = cou_gcd(a);
    int y = cou_gcd(b);

    if(k > 1)
    {
      if(x+y >= k)
        printf("YES\n");
      else
        printf("NO\n");   
    }else if(k == 1){
      if((a%b==0||b%a==0)&&a!=b)
        printf("YES\n");
      else
        printf("NO\n");
    }
  }
    return 0;
}

附上一张我超时的代码:

#include<iostream>
using namespace std;
int cou_gcd(int x)
{
  int sum = 0;

  for(int i = 2; i <= x/i; i++)
  {
    while(x%i==0)
    {
      sum++;
      x/=i;
    }
  }

  if(x > 1) 
    sum++;

  return sum;
}

int main()
{
  int t;
  scanf("%d", &t);

  while(t--)
  {
    int a, b, k;
    scanf("%d%d%d", &a, &b, &k);
    int x = cou_gcd(a);
    int y = cou_gcd(b);
    
    if(k > 1)
    {
      if(x+y >= k)
        printf("YES\n");
      else
        printf("NO\n");   
    }else if(k == 1){
      if((a%b==0||b%a==0)&&a!=b)
        printf("YES\n");
      else
        printf("NO\n");
    }
  }
    return 0;
}

二者差距在求质因子个数时for的条件不同,

i <= x/i 会TLE
但是 i*i <= x 可以ac

posted on 2023-03-03 19:40  玛卡巴卡要ac  阅读(36)  评论(0)    收藏  举报

导航