[hdu4497]分解质因数

题意:求满足gcd(x,y,z)=G,lcm(x,y,z)=L的x,y,z的解的个数。

大致思路:首先如果L % G != 0那么无解,否则令u = L / G,问题变为,gcd(r,s,t)=1,lcm(r,s,t)=u的解的个数。然后将u分解质因数,令u=a1p1*...*akpk,考虑一种质因数ai,它不可能同时出现在r,s,t中,枚举所有情况:(1)只出现在r或s或t中,这3种情况答案都为1 (2)出现在r和s或r和t或s和t中,这3种情况答案都为2(pi-1)+1=2pi-1,所以对每一种因子答案为3*(2pi-1)+3=6pi,由乘法原理,最后答案为6k*p1*p2*...*pk。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

#include<stdio.h>

#include<string.h>

#include<iostream>

#include<stdlib.h>

#include<algorithm>

#include<math.h>

using namespace std;

typedef long long LL;

int b, a;

LL solve() {

    int x = b / a;

    int p[100], c = 0;

    for (int i = 2; (LL)i * i <= x; i ++) {

        while (x % i == 0) {

            p[c ++] = i;

            x /= i;

        }

    }

    if (x > 1) p[c ++] = x;

    p[c ++] = 0;

    LL ans = 1;

    int k = 0, last = 0;

    for (int i = 1; i < c; i ++) {

        if (p[i] != p[i - 1]) {

            k ++;

            ans *= (i - last);

            last = i;

        }

    }

    for (int i = 0; i < k; i ++) ans *= 6;

    return ans;

}

int main(){

    int T;

    cin >> T;

    while (T --) {

        cin >> a >> b;

        if (b % a != 0) puts("0");

        else cout << solve() << endl;

    }

    return 0;

}

时间: 2024-12-29 11:17:30

[hdu4497]分解质因数的相关文章

分解质因数模板

/*==================================================*| 分解质因数,可能有些地方需要改为long long \*==================================================*/ const int MAXN=100010; int prm[MAXN+1]; bool is[MAXN+1]; int getprm(int n){ int i, j, k = 0; int s, e = (int)(sqrt

java编程题 --分解质因数

package Solve; import java.util.Scanner; public class Solve { static Scanner scan = new Scanner(System.in); public static void main(String[] args) { System.out.println("请输入一个正整数:"); int num = scan.nextInt(); System.out.print(num + " = "

POJ 2773 Happy 2006 (分解质因数+容斥+二分 或 欧几里德算法应用)

Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 10309   Accepted: 3566 Description Two positive integers are said to be relatively prime to each other if the Great Common Divisor (GCD) is 1. For instance, 1, 3, 5, 7, 9...are a

codevs 1792 分解质因数

1792 分解质因数 题目描述 Description 编写一个把整数N分解为质因数乘积的程序. 输入描述 Input Description 输入一个整数 N 输出描述 Output Description 输出 分解质因数 .拆成几个质数相乘的形式,质数必须从小到大相乘 样例输入 Sample Input 756 样例输出 Sample Output 756=2*2*3*3*3*7 #include<cstdio> #include<cmath> #include<str

代码实现:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5

import java.util.Scanner; /*题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数n,重复执行第一步. (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步.*/ public class Test

分解质因数

package java算法; /** * 任意整数分解 题目:将一个正整数分解质因数.例如:输入90,打印出90=2*3*3*5. * 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可. * (2)如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步. * (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步. * * @author to

uva10780(分解质因数)

可以直接用高精度来暴力求. 也可以不用高精度: 把m分解质因数,记录每个因数和它的次数.然后计算每个因数在n的阶乘里出现了多少次,再把这个次数除以它在m中的次数,就是可能的k值.取最小的k. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #

分解质因数算法

分解质因数算法 1.从N开始递减,找到满足 : n%i ==0 && n是素数 -> result2.存result到数组,递归执行(n/result) var result = new Array(); var factor = function f(n){ if(n == 1){return ;} var n1 = n; while(n1>1){ if(isPrime(n1) && n % n1 == 0) {break;} n1--; } if(n1 ==

【bzoj2795】[Poi2012]A Horrible Poem Hash+分解质因数

题目描述 给出一个由小写英文字母组成的字符串S,再给出q个询问,要求回答S某个子串的最短循环节.如果字符串B是字符串A的循环节,那么A可以由B重复若干次得到. 输入 第一行一个正整数n (n<=500,000),表示S的长度.第二行n个小写英文字母,表示字符串S.第三行一个正整数q (q<=2,000,000),表示询问个数.下面q行每行两个正整数a,b (1<=a<=b<=n),表示询问字符串S[a..b]的最短循环节长度. 输出 依次输出q行正整数,第i行的正整数对应第i