编程俱乐部每日一练(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;
}