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语言思路
- 数据太大,不能用全部储存在列表中遍历的方法。
- 因为只要求输出拿走的苹果数量,所以可以直接进行计算。
- 第一次加,用输入的三个数分别除以苹果的总数可以得到三次能拿走的个数,但是其中会有重复的。有些苹果算上了两次,但实际没有被拿走。有些苹果算上了三次,被拿走了,要按一个算。
- 第二次减,如果这个苹果(数)被算入了两次,但实际上算入两次的话,苹果就又被取出了,要减去2。比如输入的三个数其中两个数是2和3时,6是2的倍数,所以6号苹果会先被拿出。6也是3的倍数,6号苹果又会被放回。计算第一次取出的时候,需要减去拿重的苹果。每个拿重的苹果都会被减去两次。
- 第三次加,如果被算入了三次,苹果先被拿出,又被放回,再被拿出。第一次算入了三次,第二次减会被减去六次,所以第三次加的时候要加上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;
}