欢迎访问~原文出处——博客园-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]幸运数字 容斥原理的更多相关文章

  1. BZOJ1853 Scoi2010 幸运数字 【枚举+容斥】

    BZOJ1853 Scoi2010 幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号 ...

  2. Bzoj 1853: [Scoi2010]幸运数字 容斥原理,深搜

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1774  Solved: 644[Submit][Status] ...

  3. bzoj1853[Scoi2010]幸运数字 容斥

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3027  Solved: 1128[Submit][Status ...

  4. 1853: [Scoi2010]幸运数字[容斥原理]

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status] ...

  5. [BZOJ1853][Scoi2010]幸运数字 容斥+搜索剪枝

    1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 3202  Solved: 1198[Submit][Status ...

  6. 【BZOJ1853】[Scoi2010]幸运数字 容斥原理+搜索

    Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的"幸运号码"是十进制表示中只包含数字6和8的那些号码,比如68,666,88 ...

  7. bzoj1853: [Scoi2010]幸运数字 dp+容斥原理

    在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是 ...

  8. BZOJ1853 [Scoi2010]幸运数字

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)

    传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...

随机推荐

  1. JS知识整理之 Call&Apply方法

    JavaScript中的函数也是对象,和其他JS对象一样也可以包含方法,其中Call和Apply就是其中比较重要的方法,可以用来间接的调用函数.这两个方法允许显式制定调用所需的this值,也就是说所有 ...

  2. CRLF攻击的一篇科普:新浪某站CRLF Injection导致的安全问题(转)

    转:https://www.leavesongs.com/PENETRATION/Sina-CRLF-Injection.html 新浪某站CRLF Injection导致的安全问题 PHITHON ...

  3. SSM-1第一章 认识SSM框架和Redis

    第一章 认识SSM框架和Redis   1.1 Spring框架 Sring理念  Ioc  控制反转  IOC是一个容器,在Spring中,它会认为一切Java资源都是JavaBean,容器的目标是 ...

  4. Mongodb 备份 数据导出导入

    MongoDB 客户端工具 mongochef 可以进行一系类操作 MongoDB 非客户端操作 : mongod 备份导出 mongoexport -h IP --port 端口 -u 用户名 -p ...

  5. [C++]指针与引用(定义辨析)

    1.定义:     1.1 &-----取地址运算符         功能:返变量的内存地址        Eg:int *p,m;  定义p为指向int类型变量的指针,同时定义变量m     ...

  6. dbeaver can't connect HBase1.2 using phoenix driver #1863

    1 第一个问题 Unexpected version format: 10.0.2 Unexpected version format: 10.0.2 Unexpected version forma ...

  7. js 判断身份证好是否合法

    function cidInfo(sId){ var info="" //if(!/^\d{17}(\d|x)$/i.test(sId))return false; sId=sId ...

  8. 给父元素与子元素分别设置visibility注意点

    由于机顶盒的终端特性原因,不能用display:hidden去做隐藏,就选择了visibility:hidden. 在这里遇到一个现象: 给父元素设置了hidden,但是里面的子元素依然可见.以为只是 ...

  9. python - class类 (五) 继承补充-子类继承父类属性/函数方法

    子类继承父类属性/函数方法: #方式一:(原生方式,不建议使用) class Dongwu(object): def __init__(self,name,sex,old): self.name = ...

  10. MR目录结构

    D:\MRData\MR\MRS\2017-05-25\TD-LTE_MRS_ZTE_OMC1_20170425000000.zip 每个zip中包含若干FDD-LTE_MRS_OMC1_28163_ ...