Home11,29:取苹果

Description

胜鹏dalao有n个苹果,编号为1−n。一天,子旭dalao想去胜鹏dalao那吃苹果,为了难住子旭dalao,胜鹏大佬给子旭dalao出了一道题。所有苹果开始时都是未被取出的,子旭dalao要分别进行三次操作,每次操作他都选一个质数x,将编号为x及其倍数的苹果都操作一次(如果苹果被取出,那么操作后苹果应该被放回,回到未取出状态,如果苹果未被取出,则操作以后苹果被取出)

Input

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

Output

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

Sample Input 1

1
30
2 3 5

Sample Output 1

15

C语言思路

  1. 数据太大,不能用全部储存在列表中遍历的方法。
  2. 因为只要求输出拿走的苹果数量,所以可以直接进行计算。
  3. 第一次加,用输入的三个数分别除以苹果的总数可以得到三次能拿走的个数,但是其中会有重复的。有些苹果算上了两次,但实际没有被拿走。有些苹果算上了三次,被拿走了,要按一个算。
  4. 第二次减,如果这个苹果(数)被算入了两次,但实际上算入两次的话,苹果就又被取出了,要减去2。比如输入的三个数其中两个数是2和3时,6是2的倍数,所以6号苹果会先被拿出。6也是3的倍数,6号苹果又会被放回。计算第一次取出的时候,需要减去拿重的苹果。每个拿重的苹果都会被减去两次。
  5. 第三次加,如果被算入了三次,苹果先被拿出,又被放回,再被拿出。第一次算入了三次,第二次减会被减去六次,所以第三次加的时候要加上4次。
#include<stdio.h>
int main()
{
    long int n;
    int t,a,b,c,i,x,y,z,s,m;
    scanf("%d",&t);
    for(i=0; i<t; i++)
    {
        scanf("%d",&n);
        scanf("%d %d %d",&a,&b,&c);
        x=a*b; 
        y=a*c;
        z=b*c;
        m=a*b*c;
        s=n/a+n/b+n/c;
        s=s-n/x-n/y-n/z;
        s=s+4*n/m;
        printf("%d\n",s);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/84673238
29