HDU 4497(质数分解和计数)

来源:互联网 发布:复杂sql语句优化 编辑:程序博客网 时间:2024/05/16 18:00

如果G%L != 0,说明一定无解。

把K = G / L质数分解,G / L = p1^t1 * p2^t2 * p3^t3 * ……;同时 x/= L, y/= L, z/=L,不影响结果。

假设三个数字的质数分解是:

x = p1^i1 * p2^i2 * p3^i3 * ……

y = p1^j1 * p2^j2 * p3^j3 * ……

z = p1^k1 * p2^k2 * p3^k3 * ……

要保证x, y, z互质,并且lcm(x, y, z) = K, 那么对于p1来说,i1, j1, k1里面一定有一个是0,并且一定有一个是t1,一定有一个小于等于t1, 所以有3种情况:

0 0 t1          有3种

t1 t1 0         有3种

t1 0 1~t1-1  有(t1-1)*6种

一共是6*t1种。

同理对于p1、p2、p3.............

根据乘法原理,总的种数是:6*t1 + 6*t2 + ……

不用打质数表,直接从2开始枚举就行。

#include<cstdio>typedef long long ll;int main(){    int T;    scanf("%d", &T);    while(T--){        ll g, l;        scanf("%I64d%I64d", &g, &l);        if(l % g != 0){printf("0\n"); continue;}        ll k = l / g;        ll ans = 1, cnt;        ll p1 = 2;        while(1){            cnt = 0;            if(k == 1) break;            if(k % p1) {p1++; continue;}            while(k % p1 == 0){                k /= p1;                cnt++;            }            ans *= 6 * cnt;            p1++;        }        printf("%lld\n", ans);    }}


1 0
原创粉丝点击