欢迎访问~原文出处——博客园-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. 淘淘商城之Ajax跨域请求

    一.什么是跨域 (1)域名不同时: (2)域名相同,端口不同时 二.解决方法 可以使用jsonp解决跨域问题 三.什么是jsonp jsonp其实是一个跨域解决方案,js跨域请求数据是不允许的,但是跨 ...

  2. JavaSE回顾及巩固的自学之路(四)——————方法和数组,面向对象

    今天是2018.03.31,emmmmmm.好像距离上一次写Javase回顾总结已经好久好久过去,差一点就以为要停更了,哈哈哈.        其实呢,最近是真的好忙(额,这段时间觉得自己一直在学习) ...

  3. android 简单的画图片

    layout: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...

  4. android 获取图库中展示到界面中

    layout: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...

  5. python的安装和pycharm的安装

    下载地址   官网:https://www.python.org/downloads/release/python-372/ Window 平台安装 Python: Add python xx to ...

  6. luogu P4082 [USACO17DEC]Push a Box

    传送门 一个人推箱子,和之前的华容道中的棋子移动有异曲同工之妙,因为每次可以让人走到箱子的其他方向上,或者推一下箱子 所以状态可以设成\(f_{i,j,k}\),即箱子在\((i,j)\),人在\(k ...

  7. POJ3233 Matrix Power Series(快速幂求等比矩阵和)

    题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...

  8. python3中的比较函数

    在py2中,比较函数是cmp,而在py3,cmp已经不存在了,Py3启用了新的比较方法 原来在py2中,a>b就会调用a对象中的__cmp__函数,而现在a>b会调用a对象中的__lt__ ...

  9. Database学习 - mysql 数据库 外键

    外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...

  10. Fragment add replace 区别

    首先获取FragmentTransaction对象:FragmentTransaction transaction = getFragmentManager().beginTransaction(); ...