取苹果(2018.11.29)

取苹果

题目传送门
Description
胜鹏dalao有nn个苹果,编号为1-n1−n。一天,子旭dalao想去胜鹏dalao那吃苹果,为了难住子旭dalao,胜鹏大佬给子旭dalao出了一道题。

所有苹果开始时都是未被取出的,子旭dalao要分别进行三次操作,每次操作他都选一个质数xx,将编号为xx及其倍数的苹果都操作一次(如果苹果被取出,那么操作后苹果应该被放回,回到未取出状态,如果苹果未被取出,则操作以后苹果被取出)

Input
输入TT表示TT组测试数据(1<=T<=100)(1<=T<=100)
接下来TT组测试数据
每组第一行一个nn表示苹果的个数(1<=n<=10^9)(1<=n<=10** 9)第二行三个数a,b,ca,b,c表示子旭每次选择的数(1<=a,b,c<=10^6)(1<=a,b,c<=10**6 )(a,b,c全为质数且a,b,c两两互不相等)

Output
输出子旭dalao能拿走的苹果的个数

Sample Input 1
1
30
2 3 5

Sample Output 1
15
这个题有个关键点,只要理解了这个关键点的含义,AC就变得很容易了:a,b,c全为质数且a,b,c两两互不相等。我们可以把它理解为分别求它们两两之间与三者的最小公倍数的问题。

#include<stdio.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        long long int n,a,b,c,d,e,f,g=0,a1,b1,c1,d1,e1,f1,m,m1;
        scanf("%lld",&n);
        scanf("%lld%lld%lld",&a,&b,&c);
        d=(a*b);
        e=(b*c);
        f=(a*c);
        m=(d*c);
        a1=n/a;b1=n/b;c1=n/c;
        d1=n/d;e1=n/e;f1=n/f;
        m1=n/m;
        g=a1+b1+c1-(d1+e1+f1-m1*2)*2;
        printf("%lld\n",g);
    }
    return 0;
}

由于它们都是质数而且两两互不相等,求最小公倍时可以直接相乘。

猜你喜欢

转载自blog.csdn.net/weixin_43105110/article/details/84707285