首页 > 其他分享 >[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)

[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)

时间:2023-02-21 10:03:43浏览次数:52  
标签:tmp 剪枝 Cirno int 容斥 tot num dfs now


题目描述

[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_#define发现了一种[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_#define_02数,这种数呢只含有[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_c++_03[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_c++_04两种数字
现在[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_#define想知道[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_#define_06中有多少个数能被[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_#define_02数整除
   1<L<R<10^{10}

题目分析

由于

R<10^{10}

,最大只有10位的数可以对答案造成贡献,每一位只能为2/9,所以最多有2000多个数,再加上把是之前的数的倍数的除去,最后只有900多个。考虑容斥,用被1个整除的-被2个整除的+被3个整除的…
由于此时间复杂度是[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_#define_08,所以在dfs时剪枝就行,判断当前lcm是否大于R,同时注意lcm可能爆Longlong,还要判断小于0,否则跑不出[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_整除_09这组数据(虽然也能过且[bzoj 2393] Cirno的完美算数教室 (容斥原理+dfs剪枝)_整除_10

考试时想到过此做法,以为剪枝效率不高过不了,就写了大暴力去写T3了…最后只有20pts

AC code
#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL L, R, Ans, num[2500], tot;
bool used[2500];

void init()
{
int Len = int(log10(R))+1;
for(int i = 1; i <= Len; ++i)
for(int j = 0; j < (1<<i); ++j)
{
LL now = 1; num[++tot] = 0;
for(int k = 0; k < i; ++k)
num[tot] += ((j&(1<<k)) ? 9 : 2) * now, now *= 10;
if(num[tot] > R) { tot--; continue; }
for(int k = 1; k < tot; ++k)
if(num[tot] % num[k] == 0)
{ tot--; break; }
}
}

inline LL gcd(LL a, LL b) { return b ? gcd(b, a%b) : a; }

inline void dfs(int now, int cf, LL tmp) //当前数的编号,容斥系数,当前lcm
{
if(tmp > R || tmp <= 0) return;
if(now > tot)
{
if(tmp == 1) return;
Ans += cf * (R/tmp - L/tmp);
return;
}
dfs(now+1, cf, tmp);
dfs(now+1, -cf, tmp/gcd(tmp,num[now])*num[now]);
}

int main ()
{
scanf("%lld%lld", &L, &R), --L, init(), dfs(1, -1, 1);
printf("%lld\n", Ans);
}


标签:tmp,剪枝,Cirno,int,容斥,tot,num,dfs,now
From: https://blog.51cto.com/u_15973510/6075832

相关文章

  • agc061_c 容斥+dp
    题意有两个长度为\(n\)的严格递增序列\(A_i,B_i\),满足\(\foralli\len,A_i<B_i\),且\(A_i\)和\(B_i\)的所有元素恰好取遍\(1-2n\)。现在有一个队列,对于\(1\)......
  • 浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥
    浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥目录浅析排列组合、斯特林数、贝尔数、二项式定理与推论及其反演、子集反演、广义容斥更......
  • LeetCode 组合总和(/回溯+剪枝)
    原题解题目约束题解不剪枝classSolution{public:voiddfs(vector<int>&candidates,inttarget,vector<vector<int>>&ans,vector<int>&combine,......
  • BZOJ-2301-[HAOI2011]Problem b(莫比乌斯反演+容斥)
    [HAOI2011]Problemb描述对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y)=k,gcd(x,y)函数为x和y的最大公约数。Input 第一行一个整数n,接下来n......
  • Min-Max 容斥
    好我放弃了多项式到时候再说吧。Min-Max容斥直接上式子:\[\max(S)=\sum_{T\subseteqS}(-1)^{|T|+1}\min(T)\]这个\(\min\)和\(\max\)是可以互换的。形式十分好背,......
  • 【luogu P5395】第二类斯特林数·行(容斥)(NTT)
    第二类斯特林数·行题目链接:luoguP5395题目大意第二类斯特林数是把n个不同元素放入m个相同的集合中,保证每个集合非空的方案数。给你n,对于0~n的每个m都求第二......
  • Min-Max 容斥
    概念Min-Max容斥是一种用于转化Min/Max的技巧,通常用于对Min/Max进行计数/期望一类的题目中。能用Min-Max容斥解决的题目数据范围一般较小。假设现在有全集\(U......
  • 容斥原理与反演相关
    目录目录一些容斥原理规定容斥原理\(\text{Min-Max}\)容斥一些反演规定反演是什么?二项式反演一些容斥原理规定本文中集合指代非可重集。用大写字母记一个集合,例如......
  • dfs爆搜顺序与剪枝
    dfs爆搜顺序与剪枝小猫爬山翰翰和达达饲养了N只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<)。翰翰和达......
  • 容斥原理
    这个东西需要由数学中的集合引入\(S_1=\{1,2,3,4\}\)\(S_2=\{2,4,5\}\)求\(S_1\cupS_2\)的大小根据我们高中的知识很容易可以知道\(S_1\cupS_2\)的大小是\(5\)那......