题目链接
来源:牛客网

题目描述
无奈之下痛定思痛,NE决定也带上自己的10的九次方个小伙伴去gankFF。 FF提前得知了这个消息,这可把FF急坏了.那可是10的九次方个人啊! 这时FF的小伙伴EN说:“FF莫慌,我这里有3盏BD哥的神灯,上面分别有一个素数,可以让编号被上面的数字整除的人昏睡过去,这样就可以大大削减NE的人数!”(FF所带的10的九次方个人分别被编号为1~10的九次方) FF:“好!”。FF如同找到了救命稻草。但是由于只能削减一部分人数,FF需要召集的人数应该大于等于NE剩下的人数,但是时间紧急,FF算不出来了,你能告诉FF至少要准备多少人吗?

输入描述:
第一行包含一个正整数T(T<200)之后的T行每行包含3个正整数,a,b,c(2<=a,b,c<10^6;
a!=b,b!=c,c!=a;
保证a,b,c为素数)分别代表3盏神灯上的数字。
输出描述:
输出T行
每行一个整数,表示FF至少要准备的人数。

示例1
输入
3
2 3 5
5 7 11
13 2 3

输出

266666666
623376624
307692308`

题意
一个数10的九次方,让我们输入一行数T并在10的九次方的方位内找出不能整除T个数的数有多少个;

解题思路:

根据容斥定理的推论就可以得出:(注 :|A| 意思代表A集合中元素的个数)
|AUBUC|=| A | + | B | + | C | - | A ∩ B | - |A ∩ C| - | B ∩ C | + | A ∩ B ∩ C |;

做题目步骤:

1.时间复杂度考虑
时间少于O(10^9),但枚举会超时。

2.分析题目
目标:1-10^9中,不能被a,b,c 整除的最少个数

容斥原理不会。太菜了

分解问题:

分而治之,或者反其道而行之。

这题我们先反着思考。

将问题变成:1-10^9 能a,b,c被整除的最多的个数。

在集合10^9方里,除去被a,b,c整除的数。

分析:

1.细节 a!=b,b!=c,c!=a;并且都大于2

3.选择算法,或者解决问题的知识点。

通过分析,在已经学习的知识里,马上就可以想到容斥原理。

4.考虑优化,数组大小,数据类型
ll

总结提升:
1.对于容斥原理使用掌握的不够:
2.需要扩展知识面。

关于 容斥原理知识:
1.简单的排列问题
2.方程整数解问题
3.求指定区间内与n互素的数的个数:
4.求在给定区间内,能被给定集合至少一个数整除的数个数
5.能满足一定数目匹配的字符串的个数问题
6.路径的数目问题
7.错排问题
推荐博客:记录

# include<iostream>
# include<cstdio>
# include<cstring>
using namespace std;
typedef long long ll;
const ll maxn=1e9;
int main()
{
   
    int T;
    scanf("%d",&T);
    while(T--)
    {
   
        ll a,b,c;
        ll ans;
        scanf("%lld%lld%lld",&a,&b,&c);
        ans=maxn/a+maxn/b+maxn/c-maxn/(a*b)-maxn/(a*c)-maxn/(b*c)+maxn/(a*b*c); //容斥定理;
        printf("%lld\n",maxn-ans);
    }
    return 0;
 }