蓝桥杯第十五届CA省赛【因数计数】题解

题解发布于 个人博客

还没仔细打理,fork 别人的,等以后有空了改一下代码显示

真题链接

篮球杯官网现在支持 C++17,正式赛不知道是不是还是 C++11

因数计数

这是比赛里的第四个编程题。

题目大意

给定一个长度为 n n n 的正整数数组 a a a,求有多少个四元组 ( i , j , k , l ) (i, j, k, l) (i,j,k,l) 满足 ( a i , a j ) ∣ ( a k , a l ) (a_i, a_j) \mid (a_k, a_l) (ai,aj)(ak,al) i , j , k , l i, j, k, l i,j,k,l 互不相同。

  • 其中 ( a i , a j ) ∣ ( a k , a l ) (a_i, a_j) \mid (a_k, a_l) (ai,aj)(ak,al) 表示 a i ∣ a k a_i \mid a_k aiak a j ∣ a l a_j \mid a_l ajal;
  • x ∣ y x \mid y xy 表示 x x x 整除 y y y,例如 2 ∣ 4 2 \mid 4 24.

数据范围

  • 1 ≤ n , a i ≤ 1 0 5 1 \leq n, a_i \leq 10^5 1n,ai105.

Solution

这题很明显是一道容斥。在满足 ( a i , a j ) ∣ ( a k , a l ) (a_i, a_j) \mid (a_k, a_l) (ai,aj)(ak,al) 的基础上,我们令 A B C D E ABCDE ABCDE 分别表示以下几个四元组。

  • A A A 表示 i ≠ k i \neq k i=k j ≠ l j \neq l j=l;
  • B B B 表示 i = j i = j i=j;
  • C C C 表示 i = l i = l i=l;
  • D D D 表示 j = k j = k j=k;
  • E E E 表示 k = l k = l k=l.

那么题目要求的答案就是

a n s = A   B ‾   C ‾   D ‾   E ‾ = A − B ∪ C ∪ D ∪ E ‾ . ans = A\ \overline{B}\ \overline{C}\ \overline{D}\ \overline{E} = A - \overline{B \cup C \cup D \cup E}. ans=A B 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值