【bzoj2393】【Cirno的完美算数教室】容斥原理的剪枝应用
(上不了p站我要死了,侵权度娘背锅)
在用容斥定理时,常常会用到dfs的形式,如果枚举完所有的情况可能会超时,其剪枝的优化很是重要。
Description
~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~
现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~
但是Cirno这么天才的妖精才不屑去数啦
只能依靠聪明的你咯。
Input
一行正整数L R
( 1 < L < R < 10^10)
Output
一个正整数,代表所求的答案
Sample Input
1 100
Sample Output
58
像这种筛数的题很容易想到用容斥原理。
一个数的倍数-两个数的倍数+三个数的倍数……
我们发现,baka数一共有2^10个,但是其中有很多成倍数关系。于是就可以筛去不必要的数(倍数关系的数)。这要就可以减少很多数字了。
dfs时也有剪枝优化,如果此时的lcm已经大于上限,就可以return了。如果先枚举大的,可以减更多的枝。
排序前与排序后的对比
主要是练一下模板
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#ifdef WIN32
#define RIN "%I64d"
#else
#define RIN "%lld"
#endif
ll L,R;
ll num[1<<10],tp[1<<10],cnt1,cnt,ans;
void get_num(ll x){
if(x>R) return;
if(x*10+9<=R) tp[++cnt1]=x*10+9;//,printf("%d ",x*10+9);
get_num(x*10+9);
get_num(x*10+2);
}
ll gcd(ll a,ll b){
if(b==0) return a;
return gcd(b,a%b);
}
void dfs(int step,ll now,ll lim,int state){
if(now>lim||step>cnt) return;
ll tmp=now*num[step]/gcd(now,num[step]);
ans+=lim/tmp*state;
dfs(step+1,tmp,lim,-state);
dfs(step+1,now,lim,state);
}
ll solve(ll x){
ans=0;
dfs(1,1,x,1);
return ans;
}
bool cmp(const ll &a,const ll &b){
return a>b;
}
int main(){
scanf(RIN,&L);
scanf(RIN,&R);
tp[++cnt1]=2;
get_num(0);
for(int i=1;i<=cnt1;i++){
bool bj=0;
for(int j=1;j<=cnt;j++)
if(tp[i]%num[j]==0){
bj=1;break;
}
if(!bj) num[++cnt]=tp[i];
}
sort(num+1,num+cnt+1,cmp);
ll ansl=solve(L-1);
ll ansr=solve(R);
printf(RIN"\n",ansr-ansl);
return 0;
}
【bzoj2393】【Cirno的完美算数教室】容斥原理的剪枝应用的更多相关文章
- [bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)
题目描述 CirnoCirnoCirno发现了一种bakabakabaka数,这种数呢只含有222和999两种数字 现在CirnoCirnoCirno想知道[L,R][L,R][L,R]中有多少个数能 ...
- 【BZOJ-1853&2393】幸运数字&Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1817 Solved: 665[Submit][Status] ...
- Bzoj 2393: Cirno的完美算数教室 容斥原理,深搜
2393: Cirno的完美算数教室 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 287 Solved: 175[Submit][Status][ ...
- BZOJ2393: Cirno的完美算数教室
2393: Cirno的完美算数教室 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 138 Solved: 83[Submit][Status] D ...
- [BZOJ2393] Cirno的完美算数教室(dfs+容斥原理)
传送门 先通过dfs预处理出来所有只有2和9的数,也就大概2000多个. 想在[L,R]中找到是这些数的倍数的数,可以通过容斥原理 那么如果a % b == 0,那么便可以把 a 去掉,因为 b 的倍 ...
- 【bzoj2393】Cirno的完美算数教室 数论容斥
Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数 ...
- bzoj 2393 Cirno的完美算数教室(容斥原理+搜索)
[题意] 定义C数为只包含数字2和9的数,求[L,R]内能被C数整除的个数. [思路] Dfs预处理出C数,并去除其中倍数的情况. Dfs搜索出现情况,奇数加,偶数减,当数值大于R时剪枝. [代码] ...
- BZOJ1853:[SCOI2010]幸运数字 & BZOJ2393:Cirno的完美算数教室——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=1853 https://www.lydsy.com/JudgeOnline/problem.php? ...
- bzoj 1853: [Scoi2010]幸运数字&&2393: Cirno的完美算数教室【容斥原理】
翻了一些blog,只有我用状压预处理嘛2333,.把二进制位的0当成6,1当成8就行啦.(2393是2和9 然后\( dfs \)容斥,加上一个数的\( lcm \),减去两个数的\( lcm \), ...
随机推荐
- python学习总结---面向对象2
面向对象三大特点 - 封装:既是对数据结构的封装,有是处理数据的方法的封装. - 继承:强调的父子类的关系. - 多态:不同对象调用相同的方法,有不同的响应. 类的继承 - 相关概念 - 继承:父类的 ...
- 波动数列 神奇的dp
问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度为 n 和为 s 而且后一项总是比前一项增加a或者减 ...
- 【Android】实验5 数独游戏界面设计-报告提交时间:2016.4.15
- linux sort的用法
sort -n 表示按照数字 sort -k 表示第几列 sort -t : 表示按照:来分列 sort -r 表示从大到小排列
- SimpleMDE编辑器 + 提取HTML + 美化输出
开发步骤: 1. 安装和引入(npm或者bower都可以) $ bower install simplemde --save //css - debug目录下为开发版本 <link rel=&q ...
- 一些需要注意的ts
写了一段时间ts,在从头学习一遍,温故而之新 ts的一些技巧 1.巧用注释 通过/** */形式的注释可以给 TS 类型做标记,编辑器会有更好的提示: /** A cool guy. */ inter ...
- [洛谷P4588][TJOI2018]数学计算
题目大意:有一个数$x$和取模的数$mod$,初始为$1$,有两个操作: $m:x=x\times m$并输出$x\% mod$ $pos:x=x/第pos次操作乘的数$(保证合法),并输出$x\%m ...
- [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解
原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...
- Mysql 一条SQL语句实现批量更新数据,update结合case、when和then的使用案例
如何用一条sql语句实现批量更新?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现. 复制代码 代码如下: UPDATE mytable SET myfield = CASE i ...
- bzoj 3379 - [USACO2004] 交作业
Description 一个数轴上有 \(n \le 1000\) 个位置, 每个位置有一个时间 \(t_i\) 要求在 时刻 \(t_i\) 后, 至少经过该位置一次. (去交作业) 求从 \(0\ ...