bzoj 2393 Cirno的完美算数教室(容斥原理+搜索)

【题意】

定义C数为只包含数字2和9的数,求[L,R]内能被C数整除的个数。

【思路】

Dfs预处理出C数,并去除其中倍数的情况。

Dfs搜索出现情况,奇数加,偶数减,当数值大于R时剪枝。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5
 6 typedef long long ll;
 7 const int N = 2e3+10;
 8
 9 ll a[N],b[N],vis[N],ans,tot,n,L,R;
10
11 void get_pre(int num)
12 {
13     if(num>R) return ;
14     if(num) a[++tot]=num;
15     get_pre(num*10+2);
16     get_pre(num*10+9);
17 }
18 ll gcd(ll a,ll b)
19 {
20     return b==0? a:gcd(b,a%b);
21 }
22 void dfs(int cur,int cnt,ll lcm)
23 {
24     if(cur==n+1) {
25         if(cnt&1) ans+=R/lcm-(L-1)/lcm;
26         else if(cnt) ans-=R/lcm-(L-1)/lcm;
27         return ;
28     }
29     dfs(cur+1,cnt,lcm);
30     ll val=lcm*a[cur]/(gcd(lcm,a[cur]));
31     if(val<=R) dfs(cur+1,cnt+1,val);
32 }
33
34 int main()
35 {
36     scanf("%lld%lld",&L,&R);
37     get_pre(0);
38     sort(a+1,a+tot+1);
39     for(int i=1;i<=tot;i++)
40     if(!vis[i]) {
41         b[++n]=a[i];
42         for(int j=i+1;j<=tot;j++)
43             if(a[j]%a[i]==0) vis[j]=1;
44     }
45     for(int i=1;i<=n;i++)
46         a[i]=b[n-i+1];
47     dfs(1,0,1);
48     printf("%lld\n",ans);
49     return 0;
50 }
时间: 2024-10-14 09:02:39

bzoj 2393 Cirno的完美算数教室(容斥原理+搜索)的相关文章

BZOJ 2393 Cirno的完美算数教室 容斥原理+DFS

警告:网上的题解都是误人子弟,看此篇题解之前请将脑海中对其它写于本题解之前的网上常见题解的印象全部消除之后方可阅读 此题的数据范围是10^9 但是10^10一样可以做 不影响 首先我们可以预处理出1~r以内所有只由2和9构成的⑨数 容易发现最多有1022个 但是其中有一些⑨数是另一些的倍数 比如说a是b的倍数 那么一个数如果是a的倍数那么就一定是b的倍数 我们只需要计算b即可 无需计算a 这里可以剪枝 不剪无妨 处理出不是另一个数的倍数的所有⑨数 最多应该有466个 求区间内这些数的倍数的数的数

【BZOJ-1853&amp;2393】幸运数字&amp;Cirno的完美算数教室 容斥原理 + 爆搜 + 剪枝

1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 1817  Solved: 665[Submit][Status][Discuss] Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,

BZOJ2393: Cirno的完美算数教室

2393: Cirno的完美算数教室 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 138  Solved: 83[Submit][Status] Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数啦 只能依靠聪明的你咯. Input 一行正整数L R ( 1 < L < R < 10^10

【BZOJ1853/2393】[Scoi2010]幸运数字/Cirno的完美算数教室 DFS+容斥

[BZOJ1853][Scoi2010]幸运数字 Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”

【bzoj2393】Cirno的完美算数教室 数论容斥

Description ~Cirno发现了一种baka数,这种数呢~只含有2和⑨两种数字~~ 现在Cirno想知道~一个区间中~~有多少个数能被baka数整除~ 但是Cirno这么天才的妖精才不屑去数啦 只能依靠聪明的你咯. Input 一行正整数L R ( 1 < L < R < 10^10) Output 一个正整数,代表所求的答案 Sample Input 1 100 Sample Output 58 HINT 此题数据范围应该是10^9 题解: 处理处所有数然后容斥. 1 #in

[BZOJ 1853] 大包子的幸运数字 容斥原理 搜索

搜索策略之: 尽快结束搜索. 本题将数字从大到小排序. 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <cctype> 5 #include <algorithm> 6 using namespace std; 7 #define F(i, a, b) for (register int i = (a); i <= (b); i++) 8 #

小妖精的完美游戏教室——人工智能,状态机理论篇

今天也要直播魔法,求科学的! 欢迎来到小妖精Balous的完美游戏教室! 每一款好玩的游戏里面肯定有很多人工智能,例如一些帮助玩家的NPC,一些被玩家调教小怪物,更有输掉后会卖萌的Boss(小妖精真的没有玩过东方project,真的没有,小妖精甚至连这个游戏都没听说过!).那么,米娜桑想不想知道这些人工智能是如何实现的呢?那就跟着小妖精的步伐看下去吧~~但是小妖精现在的实力不是很强耶,目前还达不到妖精姐的水平,所以小妖精也只是教大家一些简单的基础.不要见怪哟. 人工智能简单来讲,是由状态跟转移条

小妖精的完美游戏教室——魔方塔防01,路径

今天也要直播魔法,求科学的! 欢迎来到小妖精Balous的完美游戏教室! 现在呢,小妖精要教大家如何制作一个游戏,是不是很激动呢?小妖精现在也是很兴奋呀.废话不多说,我们直接进入正题.作为一个游戏,必须得有策划案,所以呢,小妖精就先简单叙述下这个游戏的策划吧~ 这是个传统的塔防游戏,玩家通过建造防御塔,升级防御塔来抵御怪物的进攻.咦?这个策划看上去很low啊.但是要做一个大型游戏,得先有好的技术对不对?我们就拿这个很low的游戏入手吧.因为小妖精是美术白痴啦,所以这个游戏的防御塔都是立方体,怪物

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

题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”. 现在lxhgww