题意略。

思路:

由于这个长方体是可以翻转的,所以我们不必考虑小长方体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的更多相关文章

  1. codeforces 1007B Pave the Parallelepiped

    codeforces 1007B Pave the Parallelepiped 题意 题解 代码 #include<bits/stdc++.h> using namespace std; ...

  2. Pave the Parallelepiped CodeForces - 1007B (计数)

    大意: 给定A,B,C, 求有多少个三元组$(a,b,c)$, 满足$a \le b \le c$, 且以若干个$(a,b,c)$为三边的长方体能填满边长(A,B,C)的长方体. 暴力枚举出$A,B, ...

  3. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  4. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  5. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  6. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  7. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  8. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  9. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

随机推荐

  1. Anacodna之conda的使用

    yum install -y bunzip2 wget https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh chmod ...

  2. Python实现ParseDuration-支持解析字符串格式的时间单位,例如将小时或者分钟数转换为秒

    python的time模块不支持单独将字符串格式的分钟数和小时数转换为秒,比如将“5m”转换为“300”(秒),不支持将“0.2h5.1m12.123s”转换为“1038.123”(秒). 但是这种字 ...

  3. IO-文件输出流

    一.输出流的原理 Java向文件中写数据的原理 Java程序-->JVM(java虚拟机)-->OS(操作系统)-->OS调用写数据的方法-->把数据写入到文件中 tips: ...

  4. 基于TP5.1实用案例及教程

    推荐<基于TP5.1实用案例及教程>书 目录: 通用封装 Export通用封装Import通用封装配合Import通用封装的ImportBaseVerify类Files通用封装Direct ...

  5. 创建软RAID5

    一  创建4块硬盘组软  RAID5  新增四块20G的新硬盘,将四块硬盘分别分区,全部大小都分为一个区,并改  id  为 “ fd ”      1创建阵列mdadm -Cv /dev/md5 - ...

  6. OLE--SWT高级控件

    OLE和ActiveX控件的支持    OLE(Object Link Embeded)是指在程序之间链接和嵌入对象数据.通过OLE技术可以在一个应用程序中执行其他的应用程序.    而ActiveX ...

  7. 【POJ - 3280】Cheapest Palindrome(区间dp)

    Cheapest Palindrome 直接翻译了 Descriptions 给定一个字符串S,字符串S的长度为M(M≤2000),字符串S所含有的字符的种类的数量为N(N≤26),然后给定这N种字符 ...

  8. mysql中防止sql注入

    什么是sql注入 图片来源:百度百科 python 操作mysql产生sql注入问题 不用ORM框架,框架中已经集成了防范sql注入的功能,使用pymysql实践一下: # 导入pymysql模块 i ...

  9. vscode中配置git

    vscode中配置git vscode 报错 未找到Git.请安装Git,或在"git.path" 设置中配置 第一步安装git git安装方法自行解决,提供git下载连接! gi ...

  10. 对平底锅和垃圾的O奖论文的整理和学习[2](2018-02-08发布于知乎)

    其实这篇论文看了一段时间,愣是没看出来这个模型怎么建立的.虽然看不懂,但是有一些部分还是很喜欢. 首先是摘要: 摘要分为八段 第一段:背景引入,太空垃圾的问题日益严重. 第二段:本文工作,包括基本的i ...