子旭大佬取苹果问题(又是找规律)(容斥定理?)(除号/的使用)

题目 Description

胜鹏dalao有n个苹果,编号为1-n。一天,子旭dalao想去胜鹏dalao那吃苹果,为了难住子旭dalao,胜鹏大佬给子旭dalao出了一道题。
所有苹果开始时都是未被取出的,子旭dalao要分别进行三次操作,每次操作他都选一个质数x,将编号为x及其倍数的苹果都操作一次(如果苹果被取出,那么操作后苹果应该被放回,回到未取出状态,如果苹果未被取出,则操作以后苹果被取出)
Input
输入T表示T组测试数据(1<=T<=100)
接下来T组测试数据
每组第一行一个n表示苹果的个数(1<=n<=10^9)
第二行三个数a,b,c表示子旭每次选择的数(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

对这个过程进行每一步的分析:

就样例数据来说,
第一次操作,a=2,
取出的是a的倍数的苹果,
即2,4,6,8,10,12,14,,,26,28,30
即有n/a个苹果被子旭大佬取出了
第二次操作,b=3,
取出的是,是b但不是a的倍数的,
即3,9,15,21,27
即有n/b-n/(ab)个苹果子旭大佬取出了
放回的是,既是a又是b的倍数的,
即6,12,18,24,30
即有n/(ab)个苹果被放回了
第三次操作,c=5,
取出的是
(1)是c不是a不是b的倍数的苹果,
即5,20,25,10
即有n/c-n/(ac)-n/(bc)+n/(abc)个苹果子旭大佬取出了
(2)是c是a是b的倍数的苹果,即30号苹果
即有n/(abc)个苹果子旭大佬放回了
即这个苹果是5的倍数时,要么取出后又放回了,已经操作了两次,要么没有动过,。。

又放回的是
(1)是c不是a是b的倍数的苹果,
即15号苹果
即有n/(bc)-n/(abc)个苹果子旭大佬放回了
(2)是c是a不是b的倍数的苹果,
即10,20,30号苹果
即n/(ac)-n/(abc)个苹果子旭大佬放回了了
即这个苹果是5的倍数,前两次中有一次取出,没有放回,第三次操作就被放回了呗

整理公式:

  ans=n/a+n/b+n/c-2*(n/a/b)-2*(n/a/c)-2*(n/b/c)+4*(n/a/b/c)

AC代码

#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        long long int n;
        scanf("%lld",&n);
        long long int a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        long long int ans=0;
        ans=n/a+n/b+n/c-2*(n/a/b)-2*(n/a/c)-2*(n/b/c)+4*(n/a/b/c);
        printf("%lld\n",ans);
    }
    return 0;
}

对于这个公式或类似的公式在代码中的实现,需要注意:

开始我写的是
ans=n/a+n/b+n/c-2*n/a/b-2*n/a/c-2*n/b/c+4*n/a/b/c;
肯定错误啊。。。呜呜呜~~
打个比方,
python一般是都算完了再取int,对结果没影响的。。

2*(100/2/3)
33.333333333333336

int(2*(100/2/3))
33

 2*100/2/3
33.333333333333336

 int(2*100/2/3)
33

但是C语言中就不一样了
在这里插入图片描述

因为这里

涉及到C语言中除号/的用法:

进行算术运算的数据类型一般为:整型(int),长整型(long),短整型(short),字符型(char),实型<实型又分单精度实型(float)双精度实型(double)>
1.当运算双方是同类型的话,那么结果也是一样的类型
比如都为整型(int),那么结果也是整型
并且采取向0取整的原则。
如果双方是float型,那么结果也是float型(小数部位是7个有效数字)
2.当运算双方不是同类型的话,那么机器就会自动地进行类型转换
double<—float
|
long
|
unsigned
|
int<—char,short
横向向左的箭头是必定转换的,
如果数据类型是char的话必须先转换为int型,
纵向的越往上级别越高,低等级的类型要先转化到高等级的数据类型,然后再进行计算,
最后结果也就是那个高等级数据类型的形式.

3.顺便补充一下强制转化

为了得到自己想要的数据类型,可以将一个不符合标准的数据类型进行强制转换,
比如float型的数据不能进行求余运算,所以必须要将他强制转化为int型方可运算,否则出错.
例:float a=4.3; (int)a%2=1;

这个题,如果建立数组的话,。。。。。不行的,长度太长了,

这种方法的代码都写完了,才知道这个问题。。555~

在这里插入图片描述

如果说你想根据n的大小来定义数组的长度,n是变量啊。。还是不行的

资料:

在这里插入图片描述

说到容斥定理。。:

其实我也不知到还有一个这么高大上的名字。。(捂脸)。。
在这里插入图片描述
就写到这里吧。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值