Given a positive integer, , find and print the number of pairs of positive integers , where , that exist such that the equation (where and are positive integers) has at least one solution.
Input Format
A single positive integer denoting .
Constraints
Output Format
Print a single integer denoting the number of such pairs.
Sample Input 0
4
Sample Output 0
2
Explanation 0
There are two such pairs: and .
可以考虑每个数的因数。
我们枚举a和x。那么对于剩下的n-ax也就是by。
我们只要看by的因数中有多少个大于a就可以了。这样复杂度就会降下很多了。
需要注意的就是一个重复问题,对于同一个a,我们的by可能有很多,对应的相同的因数可能就会记录多次。所以我们需要哈希一下去重。
这里得需要一个较快的方法,直接利用一个数组判断。
剩下的看看代码就知道了。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
#include <set>
using namespace std;
const int MAXN = 3e5+7;
int n;
vector<int>q[MAXN];
bool cmp(int x,int y)
{
return x > y;
}
int ha[MAXN];
int main()
{
scanf("%d",&n);
for(int i = 1 ; i <= n ; ++i)
{
for(int j = 1,l = sqrt(i); j <= l ; ++j)
{
if(i % j == 0)
{
q[i].push_back(j);
if(j*j != i)q[i].push_back(i/j);
}
}
sort(q[i].begin(),q[i].end(),cmp);
}
int ans = 0;
for(int i = 1 ; i < n ; ++i)
{
for(int j = 1 ; j*i < n ; ++j)
{
int x = n - i*j;
for(auto it : q[x])
{
if(it <= i)break;
if(ha[it] != i)
{
ans++;
ha[it] = i;
}
}
}
}
printf("%d\n",ans);
return 0;
}