【Luogu】P2567幸运数字(容斥爆搜)
2024-09-07 22:30:50
先预处理出幸运数,把成倍数关系的剔掉,然后用容斥原理搜索一下。
这里的容斥很像小学学的那个“班上有n个同学,有a个同学喜欢数学,b个同学喜欢语文……”那样。
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<cstring>
#define maxn 200020
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} long long q[maxn];int tot;
long long d[maxn];int cnt;
bool vis[maxn]; void find(int deep,long long now){
if(deep==){
q[++tot]=now;
return;
}
find(deep-,now*+);
find(deep-,now*+);
} bool cmp(long long a,long long b){ return a>b; } long long calc(long long l,long long r,long long e){
if(l%e==) l/=e;
else l=l/e+;
r/=e;
return r-l+;
} long long gcd(long long a,long long b){
return b==?a:gcd(b,a%b);
} long long ans=;
long long a,b; void dfs(int deep,int Cnt,long long val){
if(val>b) return;
if(deep>cnt){
if(Cnt==) return;
ans+=calc(a,b,val)*(Cnt&?:-);
return;
}
dfs(deep+,Cnt,val);
long long tmp=val/gcd(val,d[deep]);
if(1.0*tmp*d[deep]<=b) dfs(deep+,Cnt+,tmp*d[deep]);
} int main(){
a=read(),b=read();
for(int i=;i<=;++i) find(i,);
for(int i=;i<=tot;++i){
if(vis[i]==) d[++cnt]=q[i];
for(int j=i+;j<=tot;++j)
if(q[j]%q[i]==) vis[j]=;
}
sort(d+,d+cnt+,cmp);
dfs(,,);
printf("%lld\n",ans);
return ;
}
最新文章
- spring-表达式语言-SpEL【转】
- html标签
- IOS调试lldb命令常用,po,
- DOM,BOM
- JS 面向对象 编程设计
- c#多线程生产者消费者(手稿)
- STL 源码分析《2》----nth_element() 使用与源码分析
- STL容器的遍历删除
- 1 对WinMain的理解
- SZU:L89 Frog Encoding
- C#自定义配置文件节点
- (简单易懂)Java的快速失败(fail-fast)与安全失败,源码分析+详细讲解
- href的理解
- LeetCode(28)-Remove Duplicates from Sorted Array
- Python学习笔记-SQLSERVER的大批量导入以及日常操作(比executemany快3倍)
- python第十五天
- openJDK之如何下载各个版本的openJDK源码
- 利用MathType为公式编号并引用
- PCA和PCoA
- 如何清空iframe中的内容?