题目链接

已知 gcd(x, y, z) = G, lcm(x, y, z) = L, 求有多少种组合(x, y, z)可以满足条件。G, L都在32位int范围内。

思路: 素数分解 + 容斥

L : p1^t1 * p2^t2 ... * pi^ti

G: q1^s1 * q2^s2... * qi^si

若 L % G 不为0, 则不存在解;

否则 L分解结果中素因子的长度一定不小于G分解结果的素因子个数,

且对应的素数的指数部分前者(L的分解结果)一定不小于后者(G的分解结果)。

比如,对于共同的一个质因子pi, L和G分解结果中对应的指数分别为 b和c, 那么b >= c,

且三个数(也就是x, y,z)的分解因式中一定有一个pi对应的指数为c, 同时也有一个为c

另一个为b~c中任意一个数。

利用容斥: 结果 = 任意3个b~c中的数的组合个数(即(b-c+1)^3) - 没有出现b的组合个数(即(b-c)^3)

      - 没有出现c的组合个数(即(b-c)^3) + 没有出现b也没有出现c的组合个数((b-c-1)^3).

附上代码:

 /*************************************************************************
> File Name: 4497.cpp
> Author: Stomach_ache
> Mail: sudaweitong@gmail.com
> Created Time: 2014年05月20日 星期二 09时40分42秒
> Propose: 素数分解 + 容斥
************************************************************************/ #include <cmath>
#include <string>
#include <cstdio>
#include <vector>
#include <fstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std; typedef long long LL;
typedef pair<int, int> pii;
#define X first
#define Y second
const int MAX_N = ();
int prime[], cnt = // 记录素数;
bool vis[MAX_N+];
vector<pii> cnt1, cnt2; // 记录素数分解结果 // 素数筛
void
get_prime() {
memset(vis, true, sizeof(vis));
for (int i = ; i < MAX_N; i++) {
if (vis[i]) {
prime[cnt++] = i;
for (LL j = (LL)i*i; j < MAX_N; j += i) {
vis[j] = false;
}
}
}
} // 素数分解
void
split(int n, vector<pii> &ret) {
ret.clear();
for (int i = ; i < cnt && prime[i] <= n/prime[i]; i++) {
if (n % prime[i] == ) {
int count = ;
while (n % prime[i] == ) {
count++;
n /= prime[i];
}
ret.push_back(pii(prime[i], count));
}
}
if (n != ) {
ret.push_back(pii(n, ));
}
} int
main(void) {
//素数筛
get_prime();
int t;
scanf("%d", &t);
while (t--) {
int G, L;
scanf("%d %d", &G, &L);
if (L % G) {
puts("");
continue;
}
//素数分解
split(G, cnt1);
split(L, cnt2);
int ans = ;
int len1 = cnt1.size(), len2 = cnt2.size();
for (int i = , j = ; i < len1; i++, j++){
while (cnt1[i].first != cnt2[j].first) {
j++;
}
cnt2[j].second -= cnt1[i].second;
}
for (size_t i = ; i < len2; i++) {
if(cnt2[i].second == ) {
ans += ;
} else {
int c = cnt2[i].second;
//容斥
ans *= ((LL)c+)*(c+)*(c+) - *((LL)c)*(c)*(c) + ((LL)c-)*(c-)*(c-);
}
}
printf("%d\n", ans);
} return ;
}

Hdu 4497的更多相关文章

  1. GCD and LCM HDU 4497 数论

    GCD and LCM HDU 4497 数论 题意 给你三个数x,y,z的最大公约数G和最小公倍数L,问你三个数字一共有几种可能.注意123和321算两种情况. 解题思路 L代表LCM,G代表GCD ...

  2. HDU 4497 数论+组合数学

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y' ...

  3. hdu 4497 GCD and LCM 数学

    GCD and LCM Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4 ...

  4. HDU 4497 GCD and LCM(分解质因子+排列组合)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4497 题意:已知GCD(x, y, z) = G,LCM(x, y, z) = L.告诉你G.L,求满 ...

  5. HDU 4497 GCD and LCM (分解质因数)

    链接 :  http://acm.hdu.edu.cn/showproblem.php?pid=4497 假设G不是L的约数 就不可能找到三个数. L的全部素因子一定包括G的全部素因子 而且次方数 ...

  6. HDU 4497 GCD and LCM (数学,质数分解)

    题意:给定G,L,分别是三个数最大公因数和最小公倍数,问你能找出多少对. 析:数学题,当时就想错了,就没找出规律,思路是这样的. 首先G和L有公因数,就是G,所以就可以用L除以G,然后只要找从1-(n ...

  7. hdu 4497 GCD and LCM

    思路:易知L不能整除G时为0: 将L/G质因数分解,对于其中的因子p,个数为cnt,则至少有一个包含p^cnt,至少有一个数不包含p: 只有一个数包含p^cnt时,有C(3,1); 有2个数包含p^c ...

  8. HDU 4497 GCD and LCM (数论)

    题意:三个数x, y, z. 给出最大公倍数g和最小公约数l.求满足条件的x,y,z有多少组. 题解:设n=g/l n=p1^n1*p2^n2...pn^nk (分解质因数 那么x = p1^x1 * ...

  9. hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理

    //昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中 ...

随机推荐

  1. SolrCloud4.7.1分布式部署

    一.环境 软件: apache-tomcat-7.0.53.tar.gz solr-4.7.1.tgz zookeeper-3.4.6.tar.gz   规划: 三个节点IP: 192.168.50. ...

  2. Java虚拟机系列(三)---内存溢出情况及解决方法

    因为Java虚拟机内存有堆内存.方法区.虚拟机栈.本地方法栈和程序计数器五部分组成,其中程序计数器是唯一一块不会发生内存溢出异常的内存区,所以只有四类内存区可能发生内存溢出异常,其中虚拟机栈和本地方法 ...

  3. java监控文件夹下的文件变化使用jnotify

    https://blog.csdn.net/codepython/article/details/42341243?utm_source=blogxgwz1 使用jnotify https://blo ...

  4. DVWA 之low级别sql注入

    将Security level设为low,在左侧列表中选择“SQL Injection”,然后在右侧的“User ID”文本框中输入不同的数字就会显示相应的用户信息. 我们首先需要判断这里所传输的参数 ...

  5. [Day5] Nginx 变量

    一. Nginx中的变量原理 提供变量的模块和使用变量的模块 nginx启动,提供变量的模块会在一个回调函数中定义新的变量名和解析出变量的方法. 请求来了以后,使用变量的模块会根据变量名,去调用解析变 ...

  6. Python - 集合与元素之集合定义和基本操作方法

    集合(set) 定义:由不同元素组成的集合,集合中是一组无序排列可hash的值(不可变的值)例如数字.字符串.元组,可以作为字典的key 定义集合: # 定义集合 s = {1, 2, 3, 3, 3 ...

  7. 1.开始Spring

    1 对Spring的认识 为了实现控制反转,我们可以想象java创建了一个工厂类,工厂类可以去读取配置文件 比如一个.property文件.通过这个文件中的配置,反射创建一些对象,当外界需要某个类的对 ...

  8. 线程安全之suspend(挂起) 和resume(执行)

    suspend()不会释放锁 如果加锁发生在resume()之前会发生死锁 t.join()是阻塞此方法,此线程再继续:通常用于在main()主线程内,等待其它线程完成再结束main()主线程.图中j ...

  9. mysql 安装失败 start service执行不下去

    简单说一下自己安装mysql的经历坑点,新手应该都会遇到.新买了一个电脑,第一次安装的情况:在网上下载好几个不同的mysql,安装都在最后一步执行的时候,执行不下去,最后打开客户端,就是闪一下就消失了 ...

  10. 【xlwings1】快速入门

    前言:安装 pip install xlwings xlwings 安装成功后,如果运行提示报错“ImportError: no module named win32api”,请再安装 pypiwin ...