2 条题解

  • 0
    @ 2025-10-8 17:00:02
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    int main(){
        //小小数学题啦(感觉比上一题简单阿鲁!
        /*
        思路:
        b*gcd(a, b)必然为b的倍数,那么a+b也为b的倍数。
        可得a为b的倍数,gcd(a, b)为b。
        考虑枚举b(i),然后每次ans加上可与当前b匹配的合法a的数量。
        定义x为(a+b)/(b*gcd(a, b)),相应的每次枚举有多少个x就有多少个a。
        当前b(i)中x最大取值为(n+i)/(i*i)[b*gcd(a, b)],
        同时x的数量也为这个最大值,直接累计和即可。
        */
        int T; scanf("%d", &T);
        while(T--){
            LL n, m; scanf("%lld%lld", &n, &m);
            LL t=sqrt(n+m), K=min(t, m), ans=0;
            for(LL i=1; i<=K; i++) ans+=(n+i)/(i*i);
            printf("%lld\n", ans-1);
        }
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:59:54
      #include<bits/stdc++.h>
      using namespace std;
      typedef long long LL;
      int main(){
          //小小数学题啦(感觉比上一题简单阿鲁!
          /*
          思路:
          b*gcd(a, b)必然为b的倍数,那么a+b也为b的倍数。
          可得a为b的倍数,gcd(a, b)为b。
          考虑枚举b(i),然后每次ans加上可与当前b匹配的合法a的数量。
          定义x为(a+b)/(b*gcd(a, b)),相应的每次枚举有多少个x就有多少个a。
          当前b(i)中x最大取值为(n[a最大为n]+i)/(i*i)[b*gcd(a, b)],
          同时x的数量也为这个最大值,直接累计和即可。
          */
          int T; scanf("%d", &T);
          while(T--){
              LL n, m; scanf("%lld%lld", &n, &m);
              LL t=sqrt(n+m), K=min(t, m), ans=0;
              for(LL i=1; i<=K; i++) ans+=(n+i)/(i*i);
              printf("%lld\n", ans-1);
          }
          return 0;
      }
      • 1

      信息

      ID
      2117
      时间
      500ms
      内存
      256MiB
      难度
      5
      标签
      递交数
      28
      已通过
      13
      上传者