2017.10.7 国庆清北 D7T1 计数
2024-08-26 11:17:55
题目描述
给出m个数a[1],a[2],…,a[m]
求1~n中有多少数不是a[1],a[2],…,a[m]的倍数。
输入输出格式
输入格式:
输入文件名为count.in。
第一行,包含两个整数:n,m
第二行,包含m个数,表示a[1],a[2],…,a[m]
输出格式:
输出一行,包含1个整数,表示答案
输入输出样例
输入样例#1:
10 2
2 3
输出样例#1:
3
说明
对于60%的数据,1<=n<=10^6
对于另外20%的数据,m=2
对于100%的数据,1<=n<=10^9,0<=m<=20,1<=a[i]<=10^9
/*
容斥原理
ans=n/单个数-n/两个数lcm+n/三个数lcm-....+(-1)^(i+1)*n/n个数的lcm
复杂度 2^m*log 用dfs求各个数的lcm。看了老司机昨天打的T2,我竟然想手模20个数的lcm /捂脸/
千万千万要开long long,不知道哪儿需要开的话就全开long long,反正不差那点空间
*/ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std; long long n,m,ans;
long long a[]; int gcd(long long a,long long b)
{
return b?gcd(b,a%b):a;
} void dfs(long long now,int deep,int flag)
{
if(now>n) return;
if(deep==m+)
{
ans+=n/now*flag;
return;
}
dfs(now,deep+,flag);
dfs(now/gcd(now,a[deep])*a[deep],deep+,-flag);
} inline void init()
{
scanf("%lld%lld",&n,&m);
for(int i=;i<=m;i++)
{
scanf("%lld",&a[i]);
}
dfs(,,);
printf("%lld",ans);
} int main()
{
init();
return ;
}
最新文章
- OC泛型
- Android之ListView的getItemViewType和getViewTypeCount
- 切换jdk版本
- EventBus--介绍
- python字符串的编码格式
- CSS3 中的 rem 值与 px 之间的换算
- Java集合框架源码剖析:LinkedHashSet 和 LinkedHashMap
- [easyui] datebox源码阅读. 批注
- Android开发手记(28) Handler和Looper
- 开个CS5.4编译编译,调试错误贴
- HorizontalScrollView做页卡的一个小记录
- 超炫的时间轴jquery插件Timeline Portfolio
- input输入自动大写
- python中str常用操作
- Ubuntu启动eclipse问题
- clipboard.js一个可以在移动端一键复制的插件
- Couchbase 集群小实践
- 骆驼拼写法(CamelCase)
- CoreOS 添加用户并赋予sudo权限
- Effective Java部分读书笔记