HDU4497 GCD and LCM(数论,质因子分解)


HDU4497 GCD and LCM

如果 \(G \% L != 0\) ,那么输出 \(0\)

否则我们有 \(L/G=(p_1^{r_1})\cdot(p_2^{r_2})\cdot(p_3^{r_3})\cdots(p_m^{r_m})\)

我们又有:

\[x=(p_1^{i_1})\cdot(p_2^{i_2})\cdot(p_3^{i_3})\cdots(p_m^{i_m}) \\ y=(p_1^{j_1})\cdot(p_2^{j_2})\cdot(p_3^{j_3})\cdots(p_m^{j_m}) \\ z=(p_1^{k_1})\cdot(p_2^{k_2})\cdot(p_3^{k_3})\cdots(p_m^{k_m}) \]

对于某个 \(r\)\(i、j、k\) 里面一定有一个是 \(r\) ,并且一定有一个是 \(0\) ,所以 \(i,j,k\) 有一下 \(3\) 种情况:

\((r\ 0\ 0)\) ,有 \(C(3,1)\) 种。
\((r\ 0\ r)\) ,有 \(C(3,1)\) 种。
\(r\ 0\ 1~r-1)\) ,有 \((r-1)\cdot A(3,3)\) 种。

所以一共是 \(6\times r\) 种。

时间复杂度为 \(O(\sqrt{n}\cdot \log n)\)

#include

using namespace std;

int t;
long long l ,g, ans;

int main()
{
    for(scanf("%d", &t); t--; ){
        scanf("%lld%lld", &l, &g);
        if(g % l == 0){
            long long tmp = g / l;
            ans = 1;
            for(int i = 2; i * i <= g / l; i++){
                long long r = 0;
                while(tmp % i == 0) r++, tmp /= i;
                if(r) ans *= (6 * r);
            }
            if(tmp != 1) ans *= 6;
            cout << ans << endl;
        }
        else{
            puts("0");
        }
    }
    return 0;
}
ACM