一、容斥原理是奥数的四大原理之一。
容斥原理听上去很高深的一个“玩意”,其实通俗点理解就是在求解一个问题时,发现有部分被重复加了,那么就把重复部分减去,如果少加了,那么就把那部分补上。其实也就是这样。

两个集合的容斥关系公式:A∪B = A+B - A∩B (∩:重合的部分)
三个集合的容斥关系公式:A∪B∪C = A+B+C - A∩B - B∩C - C∩A +A∩B∩C

两分钟视频讲解三个数的容斥定理:
https://v.qq.com/x/cover/i20ygjztsvi2sbt/y1422cq6ct5.html
二、
运用容斥定理编程前先来做一个假设:
假设求1-10中能被2or3or7整除的数的个数? 答案: 8
关键伪代码:
10/2+10/3+10/7-10/(23)-10/(27)-10/(37)+10/(23*7)
= 5 + 3 + 1 -1 -0 -0 + 0
=8
其中,
10/2=5 这个5就是1-10内能被2整除的数的个数。
10/3=3 这个3就是1-10内能被3整除的数的个数。
10/7=1 这个1就是1-10内能被7整除的数的个数。
1-10内所有能被2or3or7整除的数的个数为8。假设1-10标号为十个人,让这些能被整除的人(8个人)都sleep,那么剩下的清醒的人就是10-sleep=2

三、用容斥定理 求n个数中能被a或b或c整除的数的个数。
理解了这些以后,看下面一道题:

本题代码:

#include<stdio.h>
int main(void)
{
    long long int NE,FF;//用NE,FF表示这两个人所率领的军队数量 
    long long int t,a,b,c,sleep;//用a,b,c来代表三个素数,slep表示能被整除的数的个数的总和 
    long long int i;
    NE=1e9;
    scanf("%lld",&t);
	while(t--) 
    {
        scanf("%lld%lld%lld",&a,&b,&c);  
        sleep=(NE/a+NE/b+NE/c-NE/(a*b)-NE/(a*c)-NE/(b*c)+NE/(a*b*c));
        FF=NE-sleep;
        printf("%lld\n",FF);                   
    }  
    return 0;
}