数学

分析能力不够强。

枚举 $a$ 不足以快速计算所有形如 $(a,b,c)$ 的三元组数量,考虑再枚举一个 $b$ 的时间复杂度,由于 $ab+ac+bc \leq n$ 的限制,$a,b,c$ 中不能同时存在两个大于 $\sqrt{n}$ 的数。当 $a \leq \sqrt{n}$ 时 $b$ 最大能枚举到 $n$,当 $a > \sqrt{n}$ 时 $b$ 不能大于 $\sqrt{n}$。仔细分析一下能够发现实际上 $b$ 的枚举量 $\sum\limits_{i=1}^{n} \dfrac{n}{i}$ 是 $O(n \log n)$ 等级的。

配合第二个限制 $a+b+c \leq x$ 可以在已知 $a,b$ 的条件下快速计算 $c$ 的范围。

总体时间复杂度 $O(n \log n)$。

#include<bits/stdc++.h>
using namespace std;
long long n,m,ans;
void solution(){
    cin>>n>>m,ans=0ll;
    for(long long i=1ll;i<=n;i++)
        for(long long j=1ll;j<=n;j++){
            long long k=min(m-i-j,(n-i*j)/(i+j));
            if(k<=0ll) break;
            ans+=k;
        }
    cout<<ans<<'\n';
}
int T;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>T;
    while(T--) solution();
    return 0;
}
最后修改:2024 年 09 月 29 日
如果觉得我的文章对你有用,请随意赞赏