BZOJ1853 [Scoi2010]幸运数字 容斥原理
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1853
题意概括
求一个区间范围内,近似幸运数字的个数。
定义:
幸运数字:仅由6或者8组成的数字。
近似幸运数字:幸运数字的正整数倍。
题解
我们发现幸运数字很少。
然后,我们考虑容斥。
我们发现原来的大整数除几次机会很小。所以记忆化dfs容斥,中途跳出。
这样可以节省很多时间。
然后居然过去了。
代码
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cmath>
using namespace std;
typedef unsigned long long LL;
int totluck;
LL L,R,ans,luck[2050];
bool alive[2050];
void df(LL x){
if (x>R)
return;
if (x>0)
luck[++totluck]=x;
df(x*10+6);
df(x*10+8);
}
LL gcd(LL a,LL b){
return b?gcd(b,a%b):a;
}
void dfs(int num,int pos,LL Lcm){
if (pos>totluck){
if (num==0)
return;
if (num%2==1)
ans+=R/Lcm-(L-1)/Lcm;
else
ans-=R/Lcm-(L-1)/Lcm;
return;
}
dfs(num,pos+1,Lcm);
LL g=Lcm/gcd(Lcm,luck[pos]);
if (1.0*g*luck[pos]<=R)
dfs(num+1,pos+1,g*luck[pos]);
}
bool cmp(LL a,LL b){
return a>b;
}
int main(){
scanf("%llu%llu",&L,&R);
totluck=0;
df(0);
sort(luck+1,luck+totluck+1,cmp);
memset(alive,true,sizeof alive);
for (int i=1;i<totluck;i++)
for (int j=i+1;j<=totluck&&alive[i];j++)
if (luck[i]%luck[j]==0)
alive[i]=0;
int to=0;
for (int i=1;i<=totluck;i++)
if (alive[i])
luck[++to]=luck[i];
totluck=to;
ans=0;
dfs(0,1,1);
printf("%llu\n",ans);
return 0;
}
BZOJ1853 [Scoi2010]幸运数字 容斥原理的更多相关文章
- BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】
BZOJ1853 Scoi2010 幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号 ...
- Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 1774 Solved: 644[Submit][Status] ...
- bzoj1853[Scoi2010]幸运数字 容斥
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3027 Solved: 1128[Submit][Status ...
- 1853: [Scoi2010]幸运数字[容斥原理]
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 2405 Solved: 887[Submit][Status] ...
- [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝
1853: [Scoi2010]幸运数字 Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 3202 Solved: 1198[Submit][Status ...
- 【BZOJ1853】[Scoi2010]幸运数字 容斥原理+搜索
Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,88 ...
- bzoj1853: [Scoi2010]幸运数字 dp+容斥原理
在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是 ...
- BZOJ1853 [Scoi2010]幸运数字
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)
传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...
随机推荐
- Solr之.net操作
http://www.cnblogs.com/zhangweizhong/category/771055.html 插入: SolrNet.Startup.Init<Movie>(&quo ...
- Objects源码解析
Objects类解析 JDK7新增Objects类介绍(以下程序以1.8来说明) 简介: JDK7里面新增的Objects类,本人学习HashMap源码偶遇此类,所以研究一下,本类将对象常用的 ...
- luogu 1052 过河
神仙的博客,先copy了日后绝对删掉的,(因为我实在没耐心看懂啊..) 题解 step 1理解题意 在做这道题之前,一定要理解好题意,有一个需要特别注意注意的地方: 青蛙不是一定要跳到石头上[嗯... ...
- HDU2255 奔小康赚大钱 【KM算法】
题意: 每个人对不同房有不同出价,就是就是怎样匹配卖房让收入达到最大. 思路: 建立二分图,一边为N家老百姓,还有一边为N间房子.对老百姓和房子之间估价建立一条有带权边.问题就转变为了再二分图中找出一 ...
- 内置函数id,返回内存地址
a = 2 def b(): a = 3 print id(a) class c(): def __init__(self): print id(c) d =c() print id(d) print ...
- python 入门基础21 --面向对象_多态、内置方法、反射
内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...
- 【转】利用URLConnection来发送POST和GET请求
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
- script标签中type为"text/x-template"或"text/html"
写过一点前端的都会碰到需要使用JS字符串拼接HTML元素然后append到页面DOM树上的情况,一般的写法都是使用+号以字符串的形式拼接,如果是短点的还好,如果很长很长的话就会拼接到令人崩溃了. 比如 ...
- nodejs 使用http模块保存源码
var xpath=require("xpath"); var fs=require("fs"); var dom = require('xmldom').DO ...
- 安装java时,配置环境变量classpath的作用
想必大家在安装javaSE或其它版本时会注意到,在配置环境变量path之后,还需要新建一个名为CLASSPATH,变量值设为 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt. ...