Hdu 4497
已知 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的更多相关文章
- GCD and LCM HDU 4497 数论
GCD and LCM HDU 4497 数论 题意 给你三个数x,y,z的最大公约数G和最小公倍数L,问你三个数字一共有几种可能.注意123和321算两种情况. 解题思路 L代表LCM,G代表GCD ...
- HDU 4497 数论+组合数学
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4497 解题思路:将满足条件的一组x,z,y都除以G,得到x‘,y',z',满足条件gcd(x',y' ...
- 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 ...
- 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,求满 ...
- HDU 4497 GCD and LCM (分解质因数)
链接 : http://acm.hdu.edu.cn/showproblem.php?pid=4497 假设G不是L的约数 就不可能找到三个数. L的全部素因子一定包括G的全部素因子 而且次方数 ...
- HDU 4497 GCD and LCM (数学,质数分解)
题意:给定G,L,分别是三个数最大公因数和最小公倍数,问你能找出多少对. 析:数学题,当时就想错了,就没找出规律,思路是这样的. 首先G和L有公因数,就是G,所以就可以用L除以G,然后只要找从1-(n ...
- hdu 4497 GCD and LCM
思路:易知L不能整除G时为0: 将L/G质因数分解,对于其中的因子p,个数为cnt,则至少有一个包含p^cnt,至少有一个数不包含p: 只有一个数包含p^cnt时,有C(3,1); 有2个数包含p^c ...
- 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 * ...
- hdu 4497 GCD and LCM 质因素分解+排列组合or容斥原理
//昨天把一个i写成1了 然后挂了一下午 首先进行质因数分解g=a1^b1+a2^b2...... l=a1^b1'+a2^b2'.......,然后判断两种不可行情况:1,g的分解式中有l的分解式中 ...
随机推荐
- DataLakeAnalytics: 解析IP地址对应的国家城市地址的能力
Data Lake Analytics 作为云上数据处理的枢纽,最近加入了通过IP地址查找对应的国家.省份.城市.ISP的函数, 今天带大家体验一下. 函数详细介绍 本次一共添加了下面这些函数: ip ...
- 洛谷 P2886 [USACO07NOV]牛继电器Cow Relays
题面 解题思路 ## floyd+矩阵快速幂,跟GhostCai爷打赌用不用离散化,最后完败..GhostCai真是tql ! 有个巧妙的方法就是将节点重新编号,因为与节点无关. 代码 #includ ...
- [转]js模块化——AMD及require.js
由CommonJS组织提出了许多新的JavaScript架构方案和标准,希望能为前端开发提供统一的指引.AMD规范就是其中比较著名一个,全称是Asynchronous Module Definitio ...
- Tomcat6 配置快逸报表
一.下载快逸报表程序,安装并创建报表 thunder://QUFodHRwOi8vZnRwY25jLXAyc3AucGNvbmxpbmUuY29tLmNuL3B1Yi9kb3dubG9hZC8yMDE ...
- CentOS安装Eclipse luna
1 解压 Eclipse luna到/opt tar -zxvf eclipse-java-luna-SR1-linux-gtk-x86_64.tar.gz -C /opt 2 创建软链接 ln ...
- 使用Hilo.JS快速开发Flappy Bird
http://hiloteam.github.io/tutorial/flappybird.html#_9 Flappy Bird是一款前不久风靡世界的休闲小游戏.虽然它难度超高,但是游戏本身却非常简 ...
- 文件上传 - Commons FileUpload介绍
概述 FileUpload能够以多种不同的方式使用,具体取决于应用程序的要求.在最简单的情况下,调用单个方法来解析servlet请求,然后处理解析出来的Item集合.此外也可以自定义FileUploa ...
- Spring Cloud Security&Eureka安全认证(Greenwich版本)
Spring Cloud Security&Eureka安全认证(Greenwich版本) 一·安全 Spring Cloud支持多种安全认证方式,比如OAuth等.而默认是可以直接添加spr ...
- service network restart 报错重启失败
Job for network.service failed because the control process exited with error code. See “systemctl st ...
- Leetcode129. Sum Root to Leaf Numbers求根到叶子节点数字之和
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字. 例如,从根到叶子节点路径 1->2->3 代表数字 123. 计算从根到叶子节点生成的所有 ...