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的分解式中 ...
随机推荐
- 全面解析Spring中@ModelAttribute注解的用法
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:全面解析Spring中@ModelAttribute注解的用法: @ModelAttribute注解用于将方法的参数或方法的返回值绑定到 ...
- [转]Visual Studio 2010单元测试(1)--运行和定义普通单元测试
Visual Studio 2010 运行和定义单元测试 在VS2010中,单元测试的功能很强大,使得建立单元测试和编写单元测试代码,以及管理和运行单元测试都变得简单起来,通过私有访问器可以对私有方法 ...
- mysql函数,语法
转自:http://www.cnblogs.com/kissdodog/p/4168721.html MySQL数据库提供了很多函数包括: 数学函数: 字符串函数: 日期和时间函数: 条件判断函数: ...
- 你所不知道的Mac截图的强大
Mac的截图功能扩展功能很强大的,不要用QQ那个COM+Ctrl+A弱爆了的截图了~ 首先说一下两种截图 1.Command+shift+3:全屏截图,保存截图到桌面 2.Command+shift+ ...
- SQL Server代码如何快速格式化,sqlserver代码
在SQL Server中我们经常需要编写各种SQL脚本,例如存储过程和函数等,由于在编写过程中,经常会进行调整,有些关键字我们用的大写,有的我们用的小写,有的后面结束用:分割有的又没有.对于有强迫症的 ...
- spring cloud深入学习(十一)-----服务网关zuul
前面的文章我们介绍了,Eureka用于服务的注册于发现,Feign支持服务的调用以及均衡负载,Hystrix处理服务的熔断防止故障扩散,Spring Cloud Config服务集群配置中心,似乎一个 ...
- CSS样式汇总(转载)
1.字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: o ...
- Object源码阅读
native修饰符:所修饰的方法的实现是由非java代码实现的 /** * 一个java程序如果想调用本地方法,需要执行两个步骤 * 1.通过system.loadLibrary()将包含本地方法实现 ...
- Linq之Sum用法新体会
1.简单应用,求数组的和,示例: , , , , , , , , , }; double numSum = numbers.Sum(); Console.WriteLine("The sum ...
- Luogu P2066 机器分配(dp)
P2066 机器分配 题面 题目背景 无 题目描述 总公司拥有高效设备 \(M\) 台,准备分给下属的 \(N\) 个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这 \(M\ ...