2 条题解

  • 1
    @ 2024-6-9 12:03:07

    题前吐槽:Hanks是不是BT邻域? 正文:

    因为​:

    ​**(a0​,​x​)​=a1​,​[b0​,​x​]​=b1​→​x​∣b**1

    所以我们只要找所有b1的因数,一个个check即可。

    #include <bits/stdc++>
    #define __lcm(a,b) ((long long)a * b / __gcd(a, b))
    using namespace std;
    int T, a0, b0, a1, b1;
    int count()
    {
    	int ans = 0;
    	for (int i = 1; i <= sqrt(b1); i++)
            if (b1 % i == 0)
            {
                if (__lcm(i, b0) == b1 && __gcd(i, a0) == a1)
                    ans++;
                if (b1 != i * i)
                    if (__lcm(b1 / i, b0) == b1 && __gcd(b1 / i, a0) == a1)
                        ans++;
            }
    	return ans;
    }
    int main()
    {
    	cin >> T;
    	while (T--)
    	{
    		cin >> a0 >> a1 >> b0 >> b1;
    		printf("%d\n",count());
    	}
        return 0;
    }
    
    • 1
      @ 2023-1-18 20:25:02

      因为

      (a0,x)=a1,[b0,x]=b1xb1

      所以我们只要找所有b1的因数,一个个check即可。

      AC代码

      #include <bits/stdc++.h>
      #define __lcm(a,b) ((long long)a * b / __gcd(a, b))
      using namespace std;
      int T, a0, b0, a1, b1;
      int count()
      {
      	int ans = 0;
      	for (int i = 1; i <= sqrt(b1); i++)
              if (b1 % i == 0)
              {
                  if (__lcm(i, b0) == b1 && __gcd(i, a0) == a1)
                      ans++;
                  if (b1 != i * i)
                      if (__lcm(b1 / i, b0) == b1 && __gcd(b1 / i, a0) == a1)
                          ans++;
              }
      	return ans;
      }
      int main()
      {
      	cin >> T;
      	while (T--)
      	{
      		cin >> a0 >> a1 >> b0 >> b1;
      		printf("%d\n",count());
      	}
          return 0;
      }
      
      • @ 2024-2-5 8:40:14

        建议将for (int i = 1; i <= sqrt(b1); i++)这一句中sqrt(b1)改为sqrt(b1 + 1),因为sqrt返回的是小数,而i是int形变量,有时可能会导致不准确

    • 1

    [提高][NOIP2009 提高组] Hankson 的趣味题

    信息

    ID
    1649
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    133
    已通过
    43
    上传者