Pave the Parallelepiped(容斥原理 预处理每个数的因子个数)

原题:CodeForces - 1008D

题意:

在A,B,C的大长方体中有多少中小长方体满足小长方体的三条边可以分别被大的三条边整除

解析: -> 推优解析 <-

在假设没有重复计算的时候,答案应该是F(A)*F(B)*F(C) (F(x)表示x的因子的个数)

所以我们只要排除掉这些重复计算的方案数就是答案


如果可能重复计算的话,说明至少有两个数有两个以上的相同因子 (因为只有一个是不会多算的,多算的情况差不多是123和213)


两个数重复(a,b|gcd(A,B),c|C)的情况:

  • 在gcd(A,B)的因子中任意选择两个和c的组合便会多计算一次 所以 减去C(F(gcd(A,B)),2)*F(C)
  • gcd(B,C)和gcd(A,C)同理 减去C(F(gcd(B,C)),2)*F(A) 减去C(F(gcd(A,C)),2)*F(B)

三个数重复(a,b,c|gcd(A,B,C))的情况:

a==b!=c时

  • (1,2,2)(2,1,2)(2,2,1)(1,1,2)(1,2,1)(2,1,1)这些是我们一开始时算入的,但是在上面两个数重复的情况下把全部都剪完了,多减去了两个(1,1,2)(1,2,2),所以我们要 加上2*C(F(gcd(A,B,C)),2)

a!=b!=c时

  • (1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1),我们在gcd(A,B)时减去的有(1,2,3)(2,3,1)(1,3,2),同理gcd(B,C)gcd(A,C)各减去三个,多减了3次再加上(1,2,3),所以要加上4个即 加上4*C(F(gcd(A,B,C)),3)

只一个数非一个数因子(a|gcd(A,B,C),b|gcd(A,B,C),c|gcd(A,B))的情况

A=4,B=4,C=6 (1,2,4)

  • 开始时记下(1,4,2)(2,4,1)(4,1,2)(4,2,1)
  • gcd(A,B)时减去(1,4,2)(2,4,1)
  • gcd(B,C)时减去(4,1,2)
  • gcd(A,C)时减去(1,4,2)

减完了,所以还要加上去,从gcd(A,B)和gcd(A,B,C)的不同的因子中选一个加上gcd(A,B,C)中选两个即加上(F(gcd(A,B))-F(gcd(A,B,C)))*C(F(gcd(A,B,C)),2)

b|gcd(A,C),a|gcd(B,C)同,加上(F(gcd(A,C))-F(gcd(A,B,C)))*C(F(gcd(A,B,C)),2),加上(F(gcd(B,C))-F(gcd(A,B,C)))*C(F(gcd(A,B,C)),2)


每个数皆非一个数因子(a|gcd(A,B),b|gcd(B,C),c|gcd(C,A))的情况
A=6,B=10,C=15 (2,5,3)

  • 开始时记下(2,5,3)(3,2,5),但在考虑两个数重复的时候都没有减去
  • 所以要额外 减去 (F(gcd(A,B))-F(gcd(A,B,C))) * (F(gcd(A,C))-F(gcd(A,B,C)))* (F(gcd(B,C))-F(gcd(A,B,C)))

总结:

设 : A=a , B=b , C=c , gcd(A,B,C)=abc , gcd(A,B)=ab , gcd(B,C)=bc , gcd(A,C)=ac

ans=F(a)*F(b)*F(c)-C(F(ab),2)*F(c)-C(F(ac),2)*F(b)-C(F(bc),2)*F(a)
ans+=2*C(F(abc),2)+4*C(F(abc),3)
ans+=(F(ab)+F(bc)+F(ac)-3*F(abc))*C(F(abc),2)
ans-=(F(ab)-F(abc)) * (F(ac)-F(abc)) * (F(bc)-F(abc))

预处理每个数的因子的个数

这算是一个比较常用的知识了吧,而巧合的是这个东西的做法和这题的做法很像

求A的因子的个数相当于求A的两个互质因子的因子个数之积

  • F ( 18 ) = F ( 2 ) F ( 9 ) , ( 1 , 2 ) ( 1 , 3 , 9 )

在非互质的情况下,会出现重复

  • F ( 3 ) = 2 ( 1 , 3 ) , ( 1 , 1 , 1 , 3 , 3 , 1 , 3 , 3 ) , F ( 9 ) = 3 ( 1 , 3 , 9 )

现在考虑的就是去重的情况

设:求解数 A , A 的一个质因数 a , 有 A = a p b ( b a )

显然, F ( A ) = ( p + 1 ) F ( b )

F ( A a ) = ( p + 2 ) F ( b )

所以,对于任意 A a , 我们只需要知道 A 对于 a 的次方数 p , 就可以通过 A 1 的因子数转换过来

F ( A a ) = F ( A ) p + 2 p + 1


猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/81584778