hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)

GCD and LCM

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)
Total Submission(s): 3409    Accepted Submission(s):
1503

Problem Description

Given two positive integers G and L, could you tell me
how many solutions of (x, y, z) there are, satisfying that gcd(x, y, z) = G and
lcm(x, y, z) = L?
Note, gcd(x, y, z) means the greatest common divisor of x,
y and z, while lcm(x, y, z) means the least common multiple of x, y and z.

Note 2, (1, 2, 3) and (1, 3, 2) are two different solutions.

Input

First line comes an integer T (T <= 12), telling the
number of test cases.
The next T lines, each contains two positive 32-bit
signed integers, G and L.
It’s guaranteed that each answer will fit in a
32-bit signed integer.

Output

For each test case, print one line with the number of
solutions satisfying the conditions above.

Sample Input

2
6 72
7 33

Sample Output

72
0

翻译:给出g和l,求满足gcd(x,y,z)=g,lcm(x,y,z)=l的(x,y,z)组合的数量,(1, 2, 3)和(1, 3, 2)算作不同组合

分析:

g是因数,l是倍数,显然可以得到x%g=y%g=z%g=0=l%x=l%y=l%z;

进一步推出l%g=0;若不符合,无解。

根据唯一分解定理

将x,y,z分解

x=p1^a1*p2^a2……ps^as; 
y=p1^b1*p2^b2……ps^bs; 
z=p1^c2*p2^c2……ps^cs;

g是三个数的最大公约数,则g满足g=p1^min(a1,b1,c1)……ps^min(as,bs,cs)=p1^e1……ps^es

l是三个数的最小公倍数,则l满足l=p1^max(a1,b1,c1)……ps^max(as,bs,cs)=p1^h1……ps^hs

ei=min(ai,bi,ci) hi=max(ai,bi,bi)

x,y,z三个数分解后,对于每一个质因子,必然有一个指数是ei,一个指数是hi,先将这两个数固定下来

另一个数可以取ei到hi之间的数,包括ei和hi,设为ti

(1)当ti=ei或者ti=hi时,(ei,ei,hi)只有三种组合方式,(ei,hi,hi)也只有三种组合方式

(2)当ti≠ei并且ti≠hi时,(ei,ti,hi)有6种组合方式

(3)当ei=ti=hi时,只有1种组合方式

当ei≠hi时,则每个质因子全部的组合方式有6*(hi-ei)种,组合数用乘法计算结果,当hi=ei,不累乘0

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<vector>
#include<iostream>
#include<cstring>
#define inf 0x3f3f3f3f
using namespace std;
#define ll long long
const int maxx=1e6+5;
int prime[maxx];
int vis[maxx];
ll g,l;
int cnt;
void init()
{
    memset(vis,true,sizeof(vis));
    vis[0]=vis[1]=false;
    cnt=0;
    for(int i=2;i<=maxx;i++)
    {
        if(vis[i])
            prime[cnt++]=i;
        for(int j=0;j<cnt && prime[j]*i<=maxx;i++)
        {
            vis[ i*prime[j] ]=false;
            if(i%prime[j]==0) break;
        }
    }
}

int main()///hdu4497
{
    init();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        ll ans=1;
        scanf("%lld%lld",&g,&l);
        if(l%g)
            printf("0\n");
        else
        {
            for(int i=0;i<cnt;i++)
            {
                int e=0,h=0;
                while(g%prime[i]==0)
                {
                    e++;
                    g=g/prime[i];
                }
                while(l%prime[i]==0)
                {
                    h++;
                    l=l/prime[i];
                }
                if(h-e)
                {
                    ans=ans*(h-e)*6;
                }
            }
            if(g==l)///32位范围内大素数因子只能有一个,l能被g整除证明这个大素数相同,不累乘
                ;
            else if(l>1)///如果g=1,l=大素数,再乘一次6
                ans=ans*6;
            printf("%lld\n",ans);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/shoulinniao/p/10357950.html

时间: 2024-10-04 06:42:03

hdu4497-GCD and LCM-(欧拉筛+唯一分解定理+组合数)的相关文章

hdu2421-Deciphering Password-(欧拉筛+唯一分解定理+积性函数+立方求和公式)

Deciphering Password Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2357    Accepted Submission(s): 670 Problem Description Xiaoming has just come up with a new way for encryption, by calculati

2018南京icpc-J-Prime Game (欧拉筛+唯一分解定理)

题意:给定n个数ai(n<=1e6,ai<=1e6),定义,并且fac(l,r)为mul(l,r)的不同质因数的个数,求 思路:可以先用欧拉筛求出1e6以内的所有质数,然后对所有ai判断,如果ai不是质数就利用唯一分解定理计算其所有质因数.然后按照顺序依次计算每个质因子的贡献.假设n=5,对质因子2,依次记录它在数组出现的下标,如果它在2.4下标出现了,那么它的贡献即为所有包含2或4的区间个数,逆向计算,即所有区间个数-不包含2和4的区间个数,即 n(n+1)/2-m1(m1+1)/2-m2(

hdu3826-Squarefree number-(欧拉筛+唯一分解定理)

Squarefree number Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3691    Accepted Submission(s): 971 Problem Description In mathematics, a squarefree number is one which is divisible by no per

素数筛&amp;&amp;欧拉筛 BZOJ2818 Gcd BZOJ2190 [SDOI2008]仪仗队

折腾了一晚上很水的数论,整个人都萌萌哒 主要看了欧拉筛和素数筛的O(n)的算法 这个比那个一长串英文名的算法的优势在于没有多次计算一个数,也就是说一个数只筛了一次,主要是在%==0之后跳出实现的,具体的解释看的迷迷糊糊,特别是欧拉函数的求解 http://blog.csdn.net/lerenceray/article/details/12420725 代码如下 1 void ES(){ 2 for(int i=2;i<n;i++){ 3 if (!pd[i]){ 4 prime[++top]=

uva 11317 - GCD+LCM(欧拉函数+log)

题目链接:uva 11317 - GCD+LCM 题目大意:给定n,求出1~n里面两两的最大公约的积GCD和最小公倍数的积LCM,在10100进制下的位数. 解题思路:在n的情况下,对于最大公约数为i的情况又phi[n/i]次.求LCM就用两两乘积除以GCD即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; ty

noip复习——线性筛(欧拉筛)

整数的唯一分解定理: \(\forall A\in \mathbb {N} ,\,A>1\quad \exists \prod _{i=1}^{s}p_{i}^{a_{i}}=A\),其中\({\displaystyle p_{1}<p_{2}<p_{3}<\cdots <p_{s}}\)而且 \(p_{i}\)是一个质数, \(a_{i}\in \mathbb {Z} ^{+}\)(摘自维基百科) 欧拉筛通过使每个整数只会被它的最小质因子筛到来保证时间复杂度,可以用来筛质数

常见模板(欧拉筛素数,最小生成树,快排,并查集,单源最短路)

欧拉筛素数: #include<cstdio> #define maxn 10000000+10 using namespace std; int n,prime[5000001],num_prime=0,m; bool if_prime[maxn]; void euler(int limit) { for(int i=2;i<=limit;i++) { if(!if_prime[i]) prime[++num_prime]=i; for(int j=1;prime[j]*i<=l

欧拉筛(线性筛)

素数筛,就是按照顺序把合数踢掉,剩下的是素数. 欧拉筛是一种O(n)求素数的筛法.他避免了埃拉特斯特尼筛法对同一数的多次筛除. 欧拉筛的原理是只通过数的最小质因数筛数. 先上代码: #include <cstdio> using namespace std; const int maxn=10000000; int n, m, prime[maxn], isnt_prime[maxn], tot; void get_prime(int n){ isnt_prime[0]=isnt_prime[

[51NOD1181]质数中的质数(质数筛法)(欧拉筛)

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1181 思路:欧拉筛出所有素数和一个数的判定,找到大于n的最小质数序号p,并且判断p是不是质数,输出这个数. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛┗┛┃ 9 ┓┏┓┏┓┃ 10 ┛┗┛┗┛┃ 11 ┓┏┓┏┓┃ 12