JZOJsenior3476.【NOIP2013初赛】整除
来源:互联网 发布:软件开发工资待遇 编辑:程序博客网 时间:2024/06/09 20:26
problem
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
analysis
设ans(x)表示1~x中有多少个整数不能被a1,a2……an其中任何一个数整除的个数
这种题目的套路是一样的,都是求
通过容斥原理我们知道,1~n中能被x整除的数个数是
所以对于x和y两个数而言,
如果再还有一个约数z呢?那么——
所以,我们使用dfs把所有约数组合的情况搞出来
若所有已选的约数个数为奇数ans就减所有数的lcm,否则ans就加上lcm
总体时间复杂度为
code
#include<cstdio>#include<algorithm>using namespace std;int a[20];int n,l,r,ans;int gcd(int x,int y){ return x%y==0?y:gcd(y,x%y);}inline void dfs(int m,int lcm,int v){ if (m>n) { ans+=v/lcm; return; } dfs(m+1,lcm,v); long long t=-1ll*a[m]/gcd(abs(lcm),a[m])*lcm; if(abs(t)<=v)dfs(m+1,t,v);}int solve(int x){ ans=0; dfs(1,1,x); return ans;}int main(){ scanf("%d%d%d",&n,&l,&r); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } printf("%d",solve(r)-solve(l-1)); return 0;}
阅读全文
0 0
- JZOJsenior3476.【NOIP2013初赛】整除
- 【NOIP2013初赛】整除
- 3476. 【NOIP2013初赛】整除
- 0【NOIP2013初赛】整除 1铺砖问题 2【NOIP2012初赛】新壳栈 3【NOIP2013初赛】青蛙
- NOIP2013提高组初赛
- noip2013提高组初赛(答案+选择题题目+个人分析)
- JZOJ3477. 【NOIP2013初赛】青蛙(2017.10B组)
- NOIP2013
- noip2013
- noip2013
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(八)NOIP2012-NOIP2013
- NOIP 提高组 初赛 四、阅读程序写结果 习题集(八)NOIP2012-NOIP2013
- 整除
- 整除
- 整除
- 整除
- 整除
- 整除
- 《数据科学中的R语言》之字符串处理入门
- Office 2010 实现级联功能
- OSI七层模型与TCP/IP五层模型
- 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
- JavaScript学习笔记 isPrototypeOf和hasOwnProperty使用区别
- JZOJsenior3476.【NOIP2013初赛】整除
- SpringBoot使用JdbcTemplate案例(学习笔记)
- Magento -- 可配置产品的选项如何默认选中第一项
- 【数论 && 公式转换】HDU
- 矩阵乘法
- NOIP2017 模拟考试day1 2017.10.06
- 快速排序
- bzoj2086[Poi2010]Blocks 单调栈
- 一个简单的判断字符串所含字母是否有大写,并将所有字母改为大写的小程序