题意

\(t\) 组询问,给你 \(A, B, C\) ,问有多少组三元组 \((a, b, c)\) 满足他们任意排列后有: \(a|A,\ b|B,\ c|C\) 。

\(A,B,C,t\leq 10^5\)

分析

  • 我们把三个数的所有因子用 \(2^3 - 1\) 个状态表示这个数是 \(A,B,C\) 中的哪几个数字的因子。

  • 按照从小到大的顺序枚举3个数对应的集合,首先保证能够找到一种对应方式(每个数对应是谁的因子),相同的数集利用插板法计算方案避免重复。

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<cctype>
  6. #include<vector>
  7. #include<queue>
  8. #define For(s) for(int s=1;s<8;s++)
  9. using namespace std;
  10. const int N=1e5 + 7;
  11. typedef long long LL;
  12. int n,T;
  13. int sz[8],A[8],f[8],b[8]={0,1,1,2,1,2,2,3};
  14. LL ans,tmp;
  15. int gcd(int a,int b){
  16. if(!b) return a;
  17. return gcd(b,a%b);
  18. }
  19. int get(int x){
  20. int res=0;
  21. for(int i=1;i<=sqrt(x);i++)if(x%i==0){
  22. res++;
  23. if(i*i!=x) res++;
  24. }
  25. return res;
  26. }
  27. bool check(int a,int b,int c){
  28. if((a&1) && (b&2) && (c&4)
  29. return true;
  30. if((a&1) && (c&2) && (b&4))
  31. return true;
  32. if((b&1) && (a&2) && (c&4))
  33. return true;
  34. if((b&1) && (c&2) && (a&4))
  35. return true;
  36. if((c&1) && (a&2) && (b&4))
  37. return true;
  38. if((c&1) && (b&2) && (a&4))
  39. return true;
  40. return false;
  41. }
  42. LL C(int n,int m){
  43. if (m == 0) return 1;
  44. if (m == 1) return n;
  45. if (m == 2) return 1ll * n * (n - 1) / 2;
  46. if (m == 3) return 1ll * n * (n - 1) * (n - 2) / 6;
  47. }
  48. void work(){
  49. scanf("%d%d%d",&A[0],&A[1],&A[2]);
  50. ans=0; memset(sz,0,sizeof(sz));
  51. memset(f,0,sizeof(f));
  52. For(S){
  53. for(int i=0;i<3;i++) if(S>>i&1){
  54. if(!f[S]) f[S]=A[i];
  55. else f[S]=gcd(f[S],A[i]);
  56. }
  57. f[S]=get(f[S]);
  58. }
  59. For(s) For(S)if((S&s)==s){
  60. int cnt=b[S]-b[s];
  61. sz[s]+=f[S]*(cnt&1?-1:1);
  62. }
  63. For(s1)for(int s2=s1;s2<8;s2++)for(int s3=s2;s3<8;s3++){
  64. if(check(s1,s2,s3)){
  65. tmp=1;int cnt=1,cho=233;
  66. if(s1==s2) cho=s1,cnt++;
  67. if(s2==s3) cho=s2,cnt++;
  68. if(s1^cho) tmp*=sz[s1];
  69. if(s2^cho) tmp*=sz[s2];
  70. if(s3^cho) tmp*=sz[s3];
  71. if(cnt^1) tmp*=C(sz[cho]+cnt-1,cnt);
  72. ans+=tmp;
  73. }
  74. }
  75. printf("%lld\n",ans);
  76. }
  77. int main(){
  78. scanf("%d",&T);
  79. while(T--) work();
  80. return 0;
  81. }

[CF1007B]Pave the Parallelepiped[组合计数+状态压缩]的更多相关文章

  1. 2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP详细版

    2021蓝桥杯省赛C++A组试题E 回路计数 状态压缩DP 题目描述 蓝桥学院由21栋教学楼组成,教学楼编号1到21.对于两栋教学楼a和b,当a和b互质时,a和b之间有一条走廊直接相连,两个方向皆可通 ...

  2. CF1007B Pave the Parallelepiped 容斥原理

    Pave the Parallelepiped time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  3. HDU 4921 Map DFS+状态压缩+乘法计数

    算最多十条链,能截取某前缀段,每种方案都可以算出一个权值,每种方案的概率都是总数分之一,问最后能构成的所有可能方案数. 对计数原理不太敏感,知道是DFS先把链求出来,但是想怎么统计方案的时候想了好久, ...

  4. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  5. POJ3254Corn Fields(状态压缩DP入门)

    题目链接 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案(一 ...

  6. HDU4628+状态压缩DP

    /* 状态压缩DP dp[ i ]:达到i状态的最小step. 题意:每次可以去掉一个回文串,求最少几步能取完. */ #include<stdio.h> #include<stri ...

  7. hdu4670(树上点分治+状态压缩)

    树上路径的f(u,v)=路径上所有点的乘积. 树上每个点的权值都是由给定的k个素数组合而成的,如果f(u,v)是立方数,那么就说明f(u,v)是可行的方案. 问有多少种可行的方案. f(u,v)可是用 ...

  8. 状态压缩dp入门

    poj1321 http://poj.org/problem?id=1321 我们可以把棋盘的每一行看做是一个状态,如果某一列放置了棋子,那么就标记为1,否则就标记为0.然后把它看成是一个二进制数,然 ...

  9. HDU 5768 Lucky7 (容斥原理 + 中国剩余定理 + 状态压缩 + 带膜乘法)

    题意:……应该不用我说了,看起来就很容斥原理,很中国剩余定理…… 方法:因为题目中的n最大是15,使用状态压缩可以将所有的组合都举出来,然后再拆开成数组,进行中国剩余定理的运算,中国剩余定理能够求出同 ...

随机推荐

  1. python + Jenkins + requests 数据驱动接口测试 环境部署

    ** Jenkins安装: * 安装包选择:Jenkins.war * windows下有msi和war两种格式,我使用的是war,下载下来丢到xmapp的指定目录就行,操作方便一点      * m ...

  2. PHP多进程编之pcntl_fork

    其实PHP是支持并发的,只是平时很少使用而已.平时使用最多的应该是使用PHP-FMP调度php进程了吧. 但是,PHP的使用并不局限于做Web,我们完全也可以使用PHP来进行系统工具类的编程,做监控或 ...

  3. STL之容器(containers) 简介

    什么是容器? 容器用来存储数据的,数据可以是用户自定义类型(对象),也可以是预定义类型,c++中的容器主要使用如vector,list (顺序容器) 这些都是已经封装好了. 1.结构(struct): ...

  4. js实现双向链表

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...

  5. 安装SQL sever2008时显示重新启动计算机规则失败,应该怎么解决?

    1.删除注册表:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到 PendingFileRenameOpe ...

  6. __细看InnoDB数据落盘 图解 MYSQL

    http://hatemysql.com/?p=503 1.  概述 前面很多大侠都分享过MySQL的InnoDB存储引擎将数据刷新的各种情况.我们这篇文章从InnoDB往下,看看数据从InnoDB的 ...

  7. javascript中注册和移除事件的4种方式

    对于html中的一些元素注册事件的方式有多种 第一种: 复制代码代码如下: <script> function test() { alert("OK"); } < ...

  8. CentOS7中部署Showdoc

    目录 CentOS7中部署Showdoc 前置环境 部署 配置文件 解压安装包 添加启动服务 设置权限 运行安装 界面 CentOS7中部署Showdoc 文:铁乐与猫 前置环境 因为showdoc其 ...

  9. 乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group

    乘风破浪:LeetCode真题_025_Reverse Nodes in k-Group 一.前言 将一个链表按照一定的长度切成几部分,然后每部分进行翻转以后再拼接成一个链表是比较困难的,但是这也能锻 ...

  10. sql点滴43—mysql允许用户远程登陆

     方法1 局域网连接mysql报错: ERROR 1130: Host '192.168.0.220' is not allowed to connect to this MySQL server 解 ...