【NOIP2013初赛】整除

本文介绍如何使用容斥原理解决一类特定的整除问题,即计算在给定区间内不能被一系列指定整数整除的整数数量。文章提供了两种方法,包括递归枚举和基于规律的模拟计算。

题目描述:

Description
给出n个数a1,a2……an,求区间[L,R]中有多少个整数不能被其中任何一个数整除。
Input
第一行三个正整数,n,L,R。

第二行n个正整数a1,a2……an
Output
一个数,即区间[L,R]中有多少个整数不能被其中任何一个数整除。
Sample Input
2 1 1000

10 15
Sample Output
867
Data Constraint
对于30%的数据,1<=n<=10,1<=L,R<=1000

对于100%的数据,1<=n<=18,1<=L,R<=10^9
题解:

容斥原理。

答案相当于answer(r)-answer(l-1),这都是很简单的套路了。

讲讲answer(x)怎么求。

方法一:

这是我考场上想到的方法,看起来比较麻烦,理解也有点难度,感兴趣的可以参考一下咯。

为方便接下来的内容,我们先定义x1x2为x/(gbs(x1,x2)),gbs表示两个数的最小公倍数。

题目是求不能被整除的数,我们就用总数减去能被整除的数就好了。

先有一个a1,我们求1~x中能被a1整除的数,很显然是x/a1。

再加入一个a2,我们求1~x中能被a1或a2整除的数,容斥原理很显然再加上x/a2-a1a2。

再加入a3,显然再加上x/a3-a1a3-a2a3+a1a2a3

再加入a4,显然再加上x/a4-a1a4-a2a4-a3a4+a1a2a4+a1a3a4+a2a3a4-a1a2a3a4。

聪明可爱的孩子可以发现这是有规律的。

在插入a4的时候,再加上的值其实是a1,a2,a1a2,a3,a1a3,a2a3,a1a2a3这些数末尾加个a4,而这些数就是a1,a2,a3的容斥原理计算过程。

至于哪些是加哪些是减呢?

显然我们可以发现奇数个是加,偶数个是减。

然后呢,发现这些规律后,我们就可以模拟做下去了。

方法二:

刚才看别人总结时发现了一个更简单的方法。

其实,只要dfs枚举那n个数选还是不选,选奇数个答案就加上,选偶数个答案就减去。时间复杂度2^n。

### NOIP 2001 初赛 C++ 编程语言真实试题 由于具体年份的NOIP初赛题目可能易直接获取,可以提供一个基于过往竞赛特点构建的例子来模拟该年度的考试形式。对于NOIP 2001年的C++编程部分,通常会涉及基础算法理解、数据结构应用以及简单的逻辑推理能力。 #### 示例问题一:计算特定条件下的数值总 编写一段程序,给定一系列整数n(1 ≤ n ≤ 100),求解满足以下条件的所有正整数m的数量: - m能被3或5整除; - m大于给定的最大值N; ```cpp #include <iostream> using namespace std; int main(){ int N; cin >> N; // 输入最大值N int count = 0; for(int i = 1; i <= N; ++i){ if(i % 3 == 0 || i % 5 == 0){ ++count; } } cout << "符合条件的数目:" << count << endl; return 0; } ``` 此段代码实现了遍历从1至N之间的每一个自然数,并统计其中能够被3或者5整除的数字数量[^1]。 #### 示例问题二:字符串处理 给出一个由大写字母组成的字符串S,长度超过100字符。现在需要对该串中的每个字母做如下变换操作——将其ASCII码加1后再转换回对应的字符输出新形成的字符串。 ```cpp #include <cstdio> char str[101]; int main(){ scanf("%s",str); for(int i=0;str[i]!='\0';++i){ if('A'<=str[i] && str[i]<='Z'){ putchar(str[i]+1); // 对应位置上的字符增加其ASCII码再打印出来 }else{ putchar(str[i]); // 如果是大写字母则保持变 } } puts(""); // 打印换行符结束整个字符串显示 return 0; } ``` 上述代码展示了如何读取并修改输入字符串的内容,在遇到非大写的英文字母时做任何改变而仅当遇到'A-Z'范围内的字符才执行指定的操作[^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值