一 题目描述
题目链接: https://ac.nowcoder.com/acm/contest/10746/E.
给出两个正整数 a,b,计算满足方程 ax+by=x*y 的正整数(x, y) 的组数。
输入描述
输入的第一行有一个正整数 t 测试数据的组数。
每组测试数据在一行中给出两个正整数 a, b。
1 ≤ t ≤ 10 ^ 3
1 ≤ a, b ≤ 10 ^ 6
输出描述
输出一个数字表示答案
保证答案小于2 ^ 31
输入
2
1 2
2 3
输出
2
4
涉及知识点总结
欧拉筛
唯一分解定理
因子个数定理
二 题意分析
三 唯一分解定理
四 题解代码
注意求其因子时得用欧拉筛,不然会爆时间。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e6 + 10;
int cnt, prim[MAXN], st[MAXN];
void oula(int n) //欧拉筛
{
for(int i = 2; i <= n; i++)
{
if(!st[i]) prim[++cnt] = i;
for(int j = 1; prim[j] <= n / i; j++)
{
st[prim[j] * i] = 1;
if(i % prim[j] == 0) break;
}
}
}
ll get(ll x)//求因子个数
{
ll ret = 1;
for(int i = 1; i <= cnt && prim[i] <= x / prim[i]; i++)
if(x % prim[i] == 0)
{
int tmp = 0;
while(x % prim[i] == 0)
{
tmp++;
x /= prim[i];
}
ret *= tmp + 1;
}
if(x > 1) ret *= 2;
return ret;
}
int main()
{
int t;
cin >> t;
oula(MAXN-10);
while(t--)
{
int a, b;
cin >> a >> b;
ll x = a * b;
cout << get(x) << endl;
}
return 0;
}