# 编程俱乐部每日一练(2018年11月29日)取苹果

编程俱乐部每日一练(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,ca,b,c全为质数且a,b,ca,b,c两两互不相等)

Output

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

Sample Input 1

1
30
2 3 5
Sample Output 1

15


思路:用所有操作过的苹果数量减去操作两次的苹果数量。
找规律
用苹果总数整除质数为操作过的苹果数目,而操作两次的苹果标号为三个质数两两相乘所得数及其倍数。
最后将多次计算到的数减掉。
代码:

#include <stdio.h>
int main()
{
    int T,n,a,b,c;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        scanf("%d%d%d",&a,&b,&c);
        int sum;
        sum=n/a+n/b+n/c-(n/a/b+n/b/c+n/c/a)*2;//每个苹果在被减数中出现了两次,所以减数要乘二。
        if (n%a*b*c==0){
            printf("%d\n",sum+n/(a*b*c)*4);//拿样例来说,30出现了3次,减掉了6次,最后加4,以此类推。
        }
        else{
            printf("%d\n",sum);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43763903/article/details/84717528