Codeforces 1008D/1007B
题意略。
思路:
由于这个长方体是可以翻转的,所以我们不必考虑小长方体3个维度的出处,反正3条边一定有长有短能分出大小。
现在我们来考虑A,B,C三个数字,如果它们3个产生的因子互不相同,分别产生了a,b,c个因子,那么本题的答案就是a * b * c。
可是在现实中,这三个数字是会产生重合的因子的,也就是说a,b可能有公共部分,如果此时我们还将a和b相乘,那么我们会给答案带来增解。
现在我们将因子分成a,b,c,ab,bc,ac,abc这7种互不重叠,而并集却又是所有因子的个数的情况。
我们为小长方体选择的3维的因子出处分别为 [a,ab,ac,abc],[b,ab,bc,abc],[c,ac,bc,abc]。
当我们的因子没有选到同一区域内时,我们直接相乘即可,否则我们就要选择特殊的计算方法来解决。
这个题目在这里有一定容斥的思想。即便我们分类区域,但是由于有一些区域是共用的,所以还是会产生重复,这里用hash来去重。
同时要注意这题的实现技巧。
详见代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5 + ;
const int a = ;
const int b = ;
const int c = ;
const int ab = ;
const int bc = ;
const int ac = ;
const int abc = ; LL cnt[maxn],numb[];
int store[];
vector<int> va,vb,vc;
set<LL> st; void init(){
for(int i = ;i < maxn;++i)
for(int j = i;j < maxn;j += i)
cnt[j] += ; va.push_back(a);
va.push_back(ab);
va.push_back(ac);
va.push_back(abc); vb.push_back(b);
vb.push_back(bc);
vb.push_back(ab);
vb.push_back(abc); vc.push_back(c);
vc.push_back(ac);
vc.push_back(bc);
vc.push_back(abc);
}
LL cal2(LL x){
return x + x * (x - ) / ;
}
LL cal3(LL x){
return x + x * (x - ) + x * (x - ) * (x - ) / ;
}
LL gcd(LL a,LL b){
return b == ? a : gcd(b,a % b);
} int main(){
init();
LL T,A,B,C;
scanf("%lld",&T);
while(T--){
st.clear();
scanf("%lld%lld%lld",&A,&B,&C);
LL dab = gcd(A,B),dbc = gcd(B,C),dac = gcd(A,C),dabc = gcd(dab,C);
numb[abc] = cnt[dabc];
numb[ab] = cnt[dab] - numb[abc],numb[bc] = cnt[dbc] - numb[abc],numb[ac] = cnt[dac] - numb[abc];
numb[a] = cnt[A] - numb[ab] - numb[ac] - numb[abc];
numb[b] = cnt[B] - numb[ab] - numb[bc] - numb[abc];
numb[c] = cnt[C] - numb[ac] - numb[bc] - numb[abc]; LL ans = ;
for(int i = ;i < va.size();++i){
for(int j = ;j < vb.size();++j){
for(int k = ;k < vc.size();++k){
store[] = va[i],store[] = vb[j],
store[] = vc[k];
sort(store,store + );
LL hash = ;
for(int u = ;u < ;++u)
hash = hash * + store[u];
if(st.count(hash)) continue;
st.insert(hash);
int one = store[],two = store[],
three = store[];
if(one == two && two == three){
ans += cal3(numb[one]);
}
else if(one == two){
ans += numb[three] * cal2(numb[one]);
}
else if(two == three){
ans += numb[one] * cal2(numb[two]);
}
else if(one == three){
ans += numb[two] * cal2(numb[one]);
}
else{
ans += numb[one] * numb[two] * numb[three];
}
}
}
}
printf("%lld\n",ans);
}
return ;
}
Codeforces 1008D/1007B的更多相关文章
- codeforces 1007B Pave the Parallelepiped
codeforces 1007B Pave the Parallelepiped 题意 题解 代码 #include<bits/stdc++.h> using namespace std; ...
- Pave the Parallelepiped CodeForces - 1007B (计数)
大意: 给定A,B,C, 求有多少个三元组$(a,b,c)$, 满足$a \le b \le c$, 且以若干个$(a,b,c)$为三边的长方体能填满边长(A,B,C)的长方体. 暴力枚举出$A,B, ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
随机推荐
- 《 C#语言学习笔记》——自动属性
属性是访问对象状态的首选方式,因为它们禁止外部代码实现对象内部的数据存储机制.属性还对内部数据的访问方式有了更多控制.一般以非常标准的方式定义属性,即通过一个公共属性直接访问一个私有成员. 利用自动属 ...
- python查漏补缺 --- 模块及异常
1.方法定义好之后,如,def test(x) : ,此时将方法名赋值给一个新的变量,那么该变量等同于方法,可以具备test方法内部的全部功能2.导包的时候,可以使用as关键字在不同的名称下导入模块或 ...
- angular6组件封装以及发布到npm
一.创建angular项目 ng new myFirstDemo //angular-cli新建项目ng g m testm //新建模块ng g c testm/headertest //新建组件 ...
- 解决:django.db.utils.OperationalError: unable to open database file
这是一个从GitHub上下载的,一个网站项目的源码.想要在自己的电脑上运行,期间过程相当曲折,不过至此终于是完成了. 1.安装过程: python2->virtualenv->django ...
- BGP属性控制实验
目录 实验拓扑 实验需求 实验步骤 个人小结: 实验拓扑 实验需求 更改BGP路由的属性让R4访问R1优先选R2这条路 实验步骤 1. 按照图示配置IP地址及环回口地址 R1 [R1]int g0/0 ...
- Transformations 方块转换 USACO 模拟 数组 数学 耐心
1006: 1.2.2 Transformations 方块转换 时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...
- Danjgo学习笔记(一)
## 创建项目: 1. 通过命令行的方式:首先要进入到安装了django的虚拟环境中.然后执行命令: ``` django-admin startproject [项目的名称] ``` 这样就可以在当 ...
- c++随笔之编译器编译原理
/* C++编译器原理:1)首先明白声明与定义是两个不同的概念 extern int i;是声明,int i;是定义 函数就更简单了2)编译分为: 预编译:将宏替换,include等代码拷贝过来 编译 ...
- 扩展欧几里德算法(递归及非递归实现c++版)
今天终于弄懂了扩展欧几里德算法,有了自己的理解,觉得很神奇,就想着写一篇博客. 在介绍扩展欧几里德算法之前,我们先来回顾一下欧几里德算法. 欧几里德算法(辗转相除法): 辗转相除法求最大公约数,高中就 ...
- idea+Spring+Mybatis+jersey+jetty构建一个简单的web项目
一.先使用idea创建一个maven项目. 二.引入jar包,修改pom.xml <dependencies> <dependency> <groupId>org. ...