CF1007B Pave the Parallelepiped 容斥原理
2 seconds
256 megabytes
standard input
standard output
You are given a rectangular parallelepiped with sides of positive integer lengths AA, BB and CC.
Find the number of different groups of three integers (aa, bb, cc) such that 1≤a≤b≤c1≤a≤b≤c and parallelepiped A×B×CA×B×C can be paved with parallelepipeds a×b×ca×b×c. Note, that all small parallelepipeds have to be rotated in the same direction.
For example, parallelepiped 1×5×61×5×6 can be divided into parallelepipeds 1×3×51×3×5, but can not be divided into parallelepipeds 1×2×31×2×3.
The first line contains a single integer tt (1≤t≤1051≤t≤105) — the number of test cases.
Each of the next tt lines contains three integers AA, BB and CC (1≤A,B,C≤1051≤A,B,C≤105) — the sizes of the parallelepiped.
For each test case, print the number of different groups of three points that satisfy all given conditions.
4
1 1 1
1 6 1
2 2 2
100 100 100
1
4
4
165
In the first test case, rectangular parallelepiped (1,1,1)(1,1,1) can be only divided into rectangular parallelepiped with sizes (1,1,1)(1,1,1).
In the second test case, rectangular parallelepiped (1,6,1)(1,6,1) can be divided into rectangular parallelepipeds with sizes (1,1,1)(1,1,1), (1,1,2)(1,1,2), (1,1,3)(1,1,3) and (1,1,6)(1,1,6).
In the third test case, rectangular parallelepiped (2,2,2)(2,2,2) can be divided into rectangular parallelepipeds with sizes (1,1,1)(1,1,1), (1,1,2)(1,1,2), (1,2,2)(1,2,2) and (2,2,2)(2,2,2).
这题目其实求的就是a的因子乘b的因子乘c的因子
所以重点是算出a,b,c的因子
但是中间会出现重复的情况,比如(1,1,2),(1,2,1)是同一种情况
所以我们还要用容斥原理去掉这种情况
情况分为四种:a,b重负的情况;a,c重复的情况;b,c重复的情况;a,b,c重复的情况
#include <map>
#include <set>
#include <stack>
#include <cmath>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define A 0
#define B 1
#define C 2
#define AB 3
#define BC 4
#define AC 5
#define ABC 6
#define debug(a) cout << #a << " " << a << endl
using namespace std;
const int maxn = 1e5;
const int mod = 10000007;
typedef long long ll;
ll t, a, b, c, kt[5],p[10], nu[maxn+10], num[maxn+10];
ll gcd( ll a, ll b) {
return b==0?a:gcd(b,a%b);
}
map<ll,ll>mm;
vector<ll> va, vb, vc;
void init() { //预处理每个数因子的数量
for( ll i = 1; i <= maxn; i ++ ) {
for( ll j = i; j <= maxn; j +=i ) {
nu[j] ++;
}
}
va.push_back(A); va.push_back(AB);
va.push_back(AC); va.push_back(ABC); vb.push_back(B); vb.push_back(AB);
vb.push_back(BC); vb.push_back(ABC); vc.push_back(C); vc.push_back(AC);
vc.push_back(BC); vc.push_back(ABC);
} ll cal3( ll x) {
ll res = 0;
res += x + x*(x-1) + x*(x-1)*(x-2)/6;//三部分取相同,两部分取相同,三部分都不同
return res;
} ll cal2( ll x ) {
ll res = 0;
res += x + x*(x-1)/2;//两部分相同,两部分不同
return res;
}
int main() {
init();
cin >> t;
while(t--)
{
cin >> a >> b >> c;
ll ab = gcd(a,b), bc = gcd(b,c), ac = gcd(a,c);
ll abc = gcd(ab,c);
ll nABC = nu[abc];
ll nAB = nu[ab] - nABC, nBC = nu[bc] - nABC, nAC = nu[ac] - nABC;
ll nA = nu[a] - nAB - nAC - nABC, nB = nu[b] - nAB - nBC - nABC;
ll nC = nu[c] - nAC - nBC - nABC;
num[ABC] = nABC;
num[AB] = nAB, num[AC] = nAC, num[BC] = nBC;
num[A] = nA, num[B] = nB, num[C] = nC;
ll ans = 0;
mm.clear();
for( ll i = 0; i < va.size(); i ++ ) {
for( ll j = 0; j < vb.size(); j ++ ) {
for( ll k = 0; k < vc.size(); k ++ ) {
kt[0] = va[i], kt[1] = vb[j], kt[2] = vc[k];
sort( kt, kt+3 );
ll x = kt[0], y = kt[1], z = kt[2];
ll tmp = 0;
for( ll l = 0; l < 3; l ++ ) {
tmp=1ll*tmp*maxn+1ll*kt[l];
}
if( mm[tmp] ) continue;///打标记去重
mm[tmp] = 1;
if( x == y && y == z )
ans += cal3(num[x]);
else if( x == y )
ans += num[z]*cal2(num[x]);
else if( y == z )
ans += num[x]*cal2(num[y]);
else ans += num[x]*num[y]*num[z];
}
}
}
cout << ans << endl;
}
return 0;
}
CF1007B Pave the Parallelepiped 容斥原理的更多相关文章
- [CF1007B]Pave the Parallelepiped[组合计数+状态压缩]
题意 \(t\) 组询问,给你 \(A, B, C\) ,问有多少组三元组 \((a, b, c)\) 满足他们任意排列后有: \(a|A,\ b|B,\ c|C\) . \(A,B,C,t\leq ...
- codeforces 1007B Pave the Parallelepiped
codeforces 1007B Pave the Parallelepiped 题意 题解 代码 #include<bits/stdc++.h> using namespace std; ...
- CF1008D Pave the Parallelepiped
容斥原理 解法一: 其他容斥原理的题也可以用这种思想 先把$A$,$B$,$C$分解因数 一种很暴力的想法是,将这些因数分成若干个集合(画出韦恩图),然后对有序数组的三个数分别枚举其位于哪一个集合中 ...
- Pave the Parallelepiped CodeForces - 1007B (计数)
大意: 给定A,B,C, 求有多少个三元组$(a,b,c)$, 满足$a \le b \le c$, 且以若干个$(a,b,c)$为三边的长方体能填满边长(A,B,C)的长方体. 暴力枚举出$A,B, ...
- hdu4059 The Boss on Mars(差分+容斥原理)
题意: 求小于n (1 ≤ n ≤ 10^8)的数中,与n互质的数的四次方和. 知识点: 差分: 一阶差分: 设 则 为一阶差分. 二阶差分: n阶差分: 且可推出 性质: 1. ...
- hdu2848 Visible Trees (容斥原理)
题意: 给n*m个点(1 ≤ m, n ≤ 1e5),左下角的点为(1,1),右上角的点(n,m),一个人站在(0,0)看这些点.在一条直线上,只能看到最前面的一个点,后面的被档住看不到,求这个人能看 ...
- BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】
2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MBSubmit: 4032 Solved: 1817[Submit] ...
- BZOJ 2440: [中山市选2011]完全平方数 [容斥原理 莫比乌斯函数]
2440: [中山市选2011]完全平方数 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3028 Solved: 1460[Submit][Sta ...
- ACM/ICPC 之 中国剩余定理+容斥原理(HDU5768)
二进制枚举+容斥原理+中国剩余定理 #include<iostream> #include<cstring> #include<cstdio> #include&l ...
随机推荐
- vue 移动端/PC常见问题及解决方法
一.判断手机/PC浏览器语言 navigator.language // 返回语言代码 语言代码文档: http://www.lingoes.cn/zh/translator/langcode.htm ...
- Python实现网络多人聊天室
网络多人聊天室 文件结构: chatroom ├── client.py # 客户端代码 ├── language.py # 语言文件 ├── server.py # 服务端代码 └── set ...
- Spring的依赖注入和管理Bean
采用Spring管理Bean和依赖注入 1.实例化spring容器 和 从容器获取Bean对象 实例化Spring容器常用的两种方式: 方法一: 在类路径下寻找配置文件来实例化容器 [推荐使用] Ap ...
- Zabbix利用Windows性能监视器监控各项资源指标
zabbix自带的windows监控模板并没有监控windows cpu使用率的监控 在cmd命令输入perfmon 打开后默认就一项CPU占用的监控,下面以添加硬盘空闲时间做示例 1:监控图形上面右 ...
- Selenium模拟登陆百度贴吧
Selenium模拟登陆百度贴吧 from selenium import webdriver from time import sleep from selenium.webdriver.commo ...
- Spring cloud 超时配置总结
基准配置: eureka-server : 注册中心 端口号1000 service-A : 服务A端口号2000 service-B : 服务B 端口号3000 其中,B服务通过feign调用服务A ...
- C++这么难,为什么还要学习C++呢?如何学?
在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃. 这个世界本来就是残酷的,所以你不能怪C++向你展示了世界的本质 大 ...
- 【POJ - 2139】Six Degrees of Cowvin Bacon (Floyd算法求最短路)
Six Degrees of Cowvin Bacon Descriptions 数学课上,WNJXYK忽然发现人缘也是可以被量化的,我们用一个人到其他所有人的平均距离来量化计算. 在这里定义人与人的 ...
- Python 学习笔记(6)— 字符串格式化
字符串格式化处理 远古写法 以前通常使用运算符号 % ,%s 插入的值 String 类型,%.3f 指插入的值为包含 3 位小数的浮点数: format1 = "%s, %s!" ...
- c#小灶——自动类型转换和强制类型转换
前面已经认识了不同的数据类型,你们有没有尝试过让不同的数据类型进行运算呢? ; double b = a; Console.WriteLine(b); 运行结果是:1 我们把一个整型的变量赋值给了一个 ...