原题链接:Codeforces Round 962 (Div. 3)
题目理解出发点:
a,b,c均为正整数
要通过暴力搜索a,b来确定c,然后判断是否符合条件,符合条件就使得计数器加一
那么可以直接写出以下代码:
cin>>t;
while(t--){
num = 0;
cin>>n>>x;
for(int i=1;i<=max(n,x);i++)
for(int j=1;j<=max(n,x);j++)
num+=max(0,min(x-i-j,(n-i*j)/(i+j)));
cout<<num<<endl;
}
然而你会发现,n,x最高能取到,在O()的时间复杂度下是一定要超时的,所以我们要通过限制其中一个数字的暴力范围来不让它超时。
然后发现通过式子可以知道
所以可以把第二个暴力的条件改成
上代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,x;
long long num;
int main()
{
cin>>t;
while(t--){
num = 0;
cin>>n>>x;
for(int i=1;i<=max(n,x);i++)
for(int j=1;i*j<=max(n,x);j++)
num+=max(0,min(x-i-j,(n-i*j)/(i+j)));
cout<<num<<endl;
}
return 0;
}
题后总结:
其实题目最重要的想法点就在如何给b加上暴力条件以至于让时间复杂度从O()变成O(n*log(n))
如果能理解并发现这个点这题可以说是完全送分题
最后提醒:num需要开long long