容斥定理-牛客签到题

链接:https://ac.nowcoder.com/acm/contest/321/A
来源:牛客网

64bit IO Format: %lld
题目描述
FF来训练!”“一定来!”
FF成天到晚咕了NE的训练。这可把NE急坏了。为了拯救ff的知识勺,拥有知识海的NE决定去现实gank一波FF,逼他训练。 可去gank了几波发现ff居然有着成千上万的小伙伴在帮助FF阻拦NE,这几次gank,NE都失败了。无奈之下痛定思痛,NE决定也带上自己的109个小伙伴去gankFF。 FF提前得知了这个消息,这可把FF急坏了.那可是109个人啊! 这时FF的小伙伴EN说:“FF莫慌,我这里有3盏BD哥的神灯,上面分别有一个素数,可以让编号被上面的数字整除的人昏睡过去,这样就可以大大削减NE的人数!”(FF所带的109个人分别被编号为1~109) FF:“好!”。FF如同找到了救命稻草。但是由于只能削减一部分人数,FF需要召集的人数应该大于等于NE剩下的人数,但是时间紧急,FF算不出来了,你能告诉FF至少要准备多少人吗?

输入描述:
第一行包含一个正整数T(T<200)之后的T行每行包含3个正整数,a,b,c(2<=a,b,c<106;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`

题解 思路
这题首先是注意数据的大小,得用 long long;
然后我们思考题意;必然想得出一个for循环然后每次都遍历去求的话就能得出我们想要的答案,我也确实试过;但我们会发现时间复杂度会很大;最近挺多人问我说思路是对的样例也过了,为什么还是wa;其实这没办法有时候就是思路对也不一定做得出题目;因为题目的要求不同,即使同一样的题目也要注意它的要求,常有的就是数据大小的改变,数据小可以;数据大了,就需要我们去优化算法,减小时间复杂度;
最后再给个建议:多去刷题,只有让自己多去思考,遇到各类问题了,解决了,以后这些也就都会了;
说多了;
我们回到正题:这个整除三个数,得到答案中我们可以想到是会有一些数是重复的;所以,我们可以用数学的集合去考虑一下,整除后三个数的结果代表三个集合,然后考虑它们之间相交部分或者重合…按这个思路就能想到容斥定理;

在这里插入代码片
# 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;
 }

猜你喜欢

转载自blog.csdn.net/qq_43516113/article/details/85246208