Pave the Parallelepiped(有重复组合公式+状态压缩)

本文探讨了一道关于将长方体分割成多个小长方体的组合数学问题,通过巧妙的状态压缩与容斥原理,实现了高效的算法解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Pave the Parallelepiped

You are given a rectangular parallelepiped with sides of positive integer lengths A, B and C

.

Find the number of different groups of three integers (a
, b, c) such that 1≤a≤b≤c and parallelepiped A×B×C can be paved with parallelepipeds a×b×c

. Note, that all small parallelepipeds have to be rotated in the same direction.

For example, parallelepiped 1×5×6
can be divided into parallelepipeds 1×3×5, but can not be divided into parallelepipeds 1×2×3

.

Input

The first line contains a single integer t

(1≤t≤105

) — the number of test cases.

Each of the next t
lines contains three integers A, B and C (1≤A,B,C≤105

) — the sizes of the parallelepiped.

Output

For each test case, print the number of different groups of three points that satisfy all given conditions.

Example
Input

4
1 1 1
1 6 1
2 2 2
100 100 100

Output

1
4
4
165

Note

In the first test case, rectangular parallelepiped (1,1,1)

can be only divided into rectangular parallelepiped with sizes (1,1,1)

.

In the second test case, rectangular parallelepiped (1,6,1)
can be divided into rectangular parallelepipeds with sizes (1,1,1), (1,1,2), (1,1,3) and (1,1,6)

.

In the third test case, rectangular parallelepiped (2,2,2)
can be divided into rectangular parallelepipeds with sizes (1,1,1), (1,1,2), (1,2,2) and (2,2,2).

题意:

有一个 A×B×C A × B × C 的长方体,将其分成 a×b×c a × b × c 的小正方体,其中 abc a ≤ b ≤ c 问这样的abc小正方体能有多少种?

分析:

首先我们能够想到的就是abc至少一个是A的因子,一个是B的因子,一个是C的因子。

如果直接用组合数学进行推公式的话,需要考虑的情况太多,细节太多,一般人绝对考虑不全。

我们整体考虑对于a,b,c每个数无非有7中情况,所以我们考虑用三位二进制来表示状态

001 是A的因数
010 是B的因数
011 是A的因数也是B的因数即是gcd(A,B)的因数
100 是C的因数
101 是A的因数也是C的因数即是gcd(A,C)的因数
110 是B的因数也是C的因数即是gcd(B,C)的因数
111 是A的因数也是B的因数也是C的因数即是gcd(A,B,C)的因数

根据题意我们完全可以预处理处最大范围内每个数的因子个数,然后每个样例对于所给的A,B,C
求出gcd(A,B),gcd(A,C),gcd(B,C);
我们便可以利用容斥定理求出7种状态的因子个数cnt[i](i = 1,2,…7)

这样对于a,b,c我们只需要枚举每个数的状态(三重循环),并判断保证三个数至少有一个是A的因子B的因子C的因子,这样我们就得到了满足条件的a,b,c的个数。

1.如果说a,b,c都是不同的状态,那么我们就得到三种数量,从每种数量中选择1个,利用组合数很好求

2.但是如果有两个数或者三个数相同的状态,这就要求我们从一定数量中选择有重复个元素举个例子
如果ab状态相同,都是cnt[s],那么我们应该从cnt[s]中选两个,并且可以重复即a选了k,b也选了k
这就需用到有重复的组合公式:
如果从n个元素中选择r个有重复元素,其公式为:

Crn+r1 C n + r − 1 r

此链接为证明过程

这样对于枚举的一种abc状态,各个数的种类数相乘即可,最后每种abc状态个数相加即为最终答案

是个组合数学好题

code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+10;
ll C(int n,int m){//求组合数
    ll ans = 1;
    for(int i = 1; i <= m; i++){
        ans = ans * (n-i+1) / i;
    }
    return ans;
}
bool check(int a,int b,int c){//保证可以构成大正方形
    if((a & 1) && (b & 2) && (c & 4))
        return true;
    if((a & 1) && (c & 2) && (b & 4))
        return true;
    if((b & 1) && (a & 2) && (c & 4))
        return true;
    if((b & 1) && (c & 2) && (a & 4))
        return true;
    if((c & 1) && (a & 2) && (b & 4))
        return true;
    if((c & 1) && (b & 2) && (a & 4))
        return true;
    return false;
}
int gcd(int a,int b){
    if(b == 0)
        return a;
    return gcd(b,a%b);
}
int cnt[10],use[10];
int fac[maxn];
int main(){
    //预处理因子个数
    for(int i = 1; i < maxn; i++){
        for(int j = i; j < maxn; j += i){
            fac[j]++;
        }
    }
    int t,x,y,z;
    ll ans;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d%d",&x,&y,&z);
        int xy = gcd(x,y);
        int yz = gcd(y,z);
        int xz = gcd(x,z);
        int xyz = gcd(xy,z);
        //容斥计算出每种状态的因子个数
        cnt[7] = fac[xyz];//111
        cnt[6] = fac[yz] - fac[xyz];//110
        cnt[5] = fac[xz] - fac[xyz];//101
        cnt[4] = fac[z] - fac[xz] - fac[yz] + fac[xyz];//100
        cnt[3] = fac[xy] - fac[xyz];//011
        cnt[2] = fac[y] - fac[xy] - fac[yz] + fac[xyz];//010
        cnt[1] = fac[x] - fac[xy] - fac[xz] + fac[xyz];//001
        ans = 0;
        for(int a = 1; a < 8; a++){
            for(int b = a; b < 8; b++){
                for(int c = b; c < 8; c++){
                    if(check(a,b,c)){
                        memset(use,0,sizeof(use));
                        use[a]++;
                        use[b]++;
                        use[c]++;//标记某种状态出现次数
                        ll tmp = 1;
                        for(int i = 1; i < 8; i++){//有使用重复组合数公式
                            if(use[i])
                                tmp *= C(cnt[i]+use[i]-1,use[i]);
                        }
                        if(tmp > 0)
                            ans += tmp;
                    }
                }
            }
        }
        printf("%lld\n",ans);
    }
    return 0;
}
证星天机VIP版(通达信)指标用法注释 目录 第一部分 主图指标 11 一、常用指标 11 (一)、MA均线 11 (二)、MA2均线 11 (三)、BBI 多空指标 12 (四)、EXPMA 指数平均线 12 (五)、HMA 高价平均线 12 (六)、LMA 低价平均线 12 (七)、VMA 变异平均线 12 (八)、BOLL-M 布林线-主图叠加 13 (九)、PBX 瀑布线 13 (十)、ENE 轨道线 13 (十一)、MIKE 麦克支撑压力 13 (十二)、XS 薛斯通道 13 (十三)、BBIBOLL 14 (十四)、XS2 薛斯通道Ⅱ 15 (十五)、XT 箱体 15 (十六)、CYC 成本均线 15 (十七)、HJLP 虎踞龙盘(用户) 15 (十八)、CP1 操盘1号 16 (十九)、CP2 操盘2号 16 二、其他指标 16 第二部分 副图指标 17 一、常用指标用法 17 (一)、MACD 平滑异同平均 17 (二)、DMI趋向指标 17 (三)、DMA平均差 17 (四)、FSL 分水岭 17 (五)、TRIX 三重指数平均线 17 (六)、BRAR 情绪指标 18 (七)、CR 带状能量线 18 (八)、VR 成交量变异率 18 (九)、OBV累积能量线 18 (十)、ASI震动升降指标 18 (十一)、EMV简易波动指标 19 (十二)、WAVD 威廉变异离散量 19 (十三)、RSI 相对强弱指标 19 (十四)、WR 威廉指标 19 (十五)、SAR 抛物线指标 19 (十六)、经典版KDJ 20 (十七)、CCI 商品路径指标 20 (十八)、ROC变动率指标 20 (十九)、MTM 动量线 20 (二十)、BOLL 布林线 20 (二十一)、PSY 心里线 21 二、大势型 21 (一)、ABI绝对广量指标 21 (二)、ADL腾落指标 21 (三)、ADR 涨跌比率 21 (四)、ARMS 阿姆氏指标 21 (五)、BTI广量冲力指标 22 (六)、MCL麦克连指标 22 (七)、MSI 麦氏综合指标 22 (八)、OBOS 超买超卖指标 22 (九)、STIX 指数平滑广量 22 三、超买超卖型 23 (一)、CCI商品路径指标 23 (二)、KDJ 经典版KDJ 23 (三)、KDJ-TDX 精确KDJ 23 (四)、MFI 资金流量指标 23 (五)、MTM 动量线 23 (六)、OSC 变动速率动量线 24 (七)、ROC 变动率指标 24 (八)、RSI 相对强弱指标 24 (九)、MARSI 相对强弱平均线 24 (十)、KD 随机指标 24 (十一)、SKDJ 慢速随机指标 25 (十二)、UDL 引力线 25 (十三)、WR 威廉指标 25 (十四)、LWR LWR威廉指标 25 (十五)、BIAS-QL 乖离率—钱龙版 25 (十六)、BIAS乖离率 25 (十七)、BIAS36 三六乖离 26 (十八)、BB 布林极限 26 (十九)、WIDTH 极限宽 26 (二十)、ACCER 幅度涨速 26 (二十一)、CYD 承接因子 26 (二十二)、CYF 市场能量 27 (二十三)、FSL 分水岭 27 (二十四)、ADTM 动态买卖气指标 27 (二十五)、ATR 真实波幅 27 (二十六)、DKX 多空线 27 (二十七)、TAPI 加权指数成交值 27 四、趋势型 28 (一)、ASI振动升降指标 28 (二)、CHO佳庆指标 28 (三)、DMA平均差 28 (四)、DMI趋向指标 28 (五)、DPO区间震荡线 29 (六)、EMV简易波动指标 29 (七)、MACD平滑异同平均 29 (八)、QACD快速异同平均 29 (九)、TRIX三重指数平均线 29 (十)、UOS终极指标 30 (十一)、VPT量价曲线 30 (十二)、WVAD威廉变异离散线 30 (十三)、PAV 筹码引力 30 (十四)、DBQR对比强弱 30 (十五)、JS加速线 31 (十六)、PAVE强筹码引力 31 (十七)、CYE市场趋势 31 (十八)、QR强弱 31 (十九)、GDX鬼道线 31 (二十)、JLHB绝路航标 31 五、能量型 32 (一)、BRAR 情绪指标 32 (二)、CR 带状能量线 32 (三)、MASS梅斯 32 (四)、PSY 心理线 32 (五)、VR 成交量变异率 32 (六)、WAD 威廉多空力度线 33 (七)、PCNT 幅度比 33 (八)、NVI 副成交量 33 (九)、PVI 正成交量 33 (十)、CYR 市场强弱 33 六、成交量型 34 (一)、AMO 成交金额 34 (二)、OVB 累计能量线 34 (三)、VOL 成交量 34 (四)、VRSI 相对强弱量 34 (五)、HSL 换手率 34 (六)、HSCOL 换手柱 35 (七)、DBQRV 对比强弱量 35 (八)、DBLB 对比量比 35 七、均线型 35 (一)、ACD 升降线 35 (二)、EXPMA_S 指数平均线_副图 35 (三)、AMV 成本价均线 35 (四)、MCST 市场成本 36 八、图表线 36 (一)、ZXNH 直线拟合 36 (二)、ZX 重心线 36 (三)、PUCU 逆时钟曲线 36 九、路径型 37 (一)、BOLL 布林线 37 (二)、SSRP筹码峰 37 十、停损型 37 (一)、SAR抛物线指标 37 (二)、VTY价格变异率 37 十一、交易型 38 (一)、SC三叉 38 (二)、NDB脑电波 38 (三)、QZMA权证密码 (用户) 38 十二、神系 38 (一)、SG-XDT心电图 38 (二)、SG-NDT脑电图 38 (三)、SG-SMS 生命线 38 (四)、SG-LB 量比 39 (五)、SG—PF 强势股评分 39 十三、龙系 39 (一)、RAD 威力雷达 39 (二)、LON 钱龙长线 39 (三)、STH 钱龙短线 39 (四)、ZLJC 主力进出 39 (五)、ZLMM 主力买卖 40 (六)、SLZT 神龙在天 40 (七)、ADVOL 钱龙离散量 40 十四、鬼系 40 (一)、SYS 市场盈亏 40 (二)、CYQKL 博弈K线长度 41 (三)、CYW 主力控盘 41 十五、其它系 41 (一)、CJDX 超级短线 41 (二)、ZJTJ 庄家抬轿 41 (三)、ZBCD 准备抄底 41 (四)、ZJL 折价率-指标排序 41 十六、特色型 41 (一)、BDZX 波段之星 41 (二)、JF-ZNZX飓风-智能中线 42 (三)、LHXJ 猎狐先觉 42 (四)、SDLH 神雕猎狐 42 (五)、LYJH 猎鹰歼狐 42 (六)、JFZX 飓风智能中线 42 (七)、CYHT 财运亨通 42 (八)、SCR 筹码集中度 42 (九)、ASR 浮筹比例 42 (十)、FKX 反K线 42 (十一)、DTLD 顶天立地 43 (十二)、CP3 辅助操盘1号使用 43 十七、其他类型 43 (一)、DPTB 大盘同步 43 (二)、QZBS 权证必胜 43 十八、特殊画线指标 44 (一)、EQUVOL 等量图 44 (二)、EQUK 等量K线 44 (三)、CAN 压缩图 44 (四)、OX 圈叉图 44 (五)、OXHL 高低圈叉图 44 (六)、TPO 四度空间 45 (七)、TBL 新三价线 45 (八)、TOW 宝塔线 45 第三部分 有关说明 46 一、查看软件中指标用法注释 46 (一)、主图指标 46 (二)、副图指标 46 二、证券之星天机VIP版与通达信 46
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值