【vijos】1629 八(容斥原理+dfs)

https://vijos.org/p/1629

本来是想出来了的,,,,但是有个地方写挫了一直没发现,sad

就是dfs的时候我传的pos传错了QAQ

这题用容斥很好想

首先在区间[l, r]能被a整除的数有r/a-(l-1)/a,下取整。

而这题要求的是

其中B是区间内能被8整除的数,Ai分别为能整除所给的数的集合

那么我们用容斥加加减减即可。

同时要注意,算整除a和b的数并不是算a×b的数,而是lcm(a, b)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << ‘\t‘; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<‘0‘||c>‘9‘; c=getchar()) if(c==‘-‘) k=-1; for(; c>=‘0‘&&c<=‘9‘; c=getchar()) r=r*10+c-‘0‘; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }

typedef unsigned long long ll;
ll l, r, ans, a[18];
int n;
ll get(ll c) { return r/c-(l-1)/c; }
ll gcd(ll a, ll b) { return b?gcd(b, a%b):a; }
void dfs(int x, ll c, int pos) {
	if(c>r) return;
	if(x&1) ans-=get(c);
	else ans+=get(c);
	for1(i, pos+1, n) dfs(x+1, c/gcd(c, a[i])*a[i], i);
}
int main() {
	read(n);
	for1(i, 1, n) read(a[i]);
	read(l); read(r);
	dfs(0, 8, 0);
	printf("%lld\n", ans);
	return 0;
}

描述

八是个很有趣的数字啊。八=发,八八=爸爸,88=拜拜。当然最有趣的还是8用二进制表示是1000。怎么样,有趣吧。当然题目和这些都没有关系。

某个人很无聊,他想找出[a,b]中能被8整除却不能被其他一些数整除的数。

格式

输入格式

第一行一个数n,代表不能被整除的数的个数。

第二行n个数,中间用空格隔开。

第三行两个数a,b,中间一个空格。

输出格式

一个整数,为[a,b]间能被8整除却不能被那n个数整除的数的个数。

样例1

样例输入1[复制]

3
7764 6082 462
2166 53442

样例输出1[复制]

6378

限制

各个测试点1s

提示

对于30%的数据, 1≤n≤5,1≤a≤b≤100000。

对于100%的数据,1≤n≤15,1≤a≤b≤10^9,N个数全都小于等于10000大于等于1。

来源

Rcx 原创
NOIP 2009·Dream Team 模拟赛 第一期 第一题

时间: 2024-11-04 12:22:43

【vijos】1629 八(容斥原理+dfs)的相关文章

vijos P1629八 容斥原理

https://vijos.org/p/1629 注意lcm要用LL 先给一个样例 1 2 1 10 思路.其实这题就是问,给定一堆数,要求不能整除其任意一个的数字有多少个. 容辞 + lcm dfs暴力枚举每一位选还是不选,一共n位.00010101010. 然后奇减偶加 #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <algorit

洛谷1002 容斥原理+dfs OR DP

//By SiriusRen #include <bits/stdc++.h> using namespace std; #define int long long int n,m,sx,sy,xx[]={1,1,2,2,-1,-1,-2,-2,0},yy[]={2,-2,1,-1,2,-2,1,-1,0}; int stk1[25],stk2[25],stk[25],C[45][45],Ans,top; bool check(int x,int y){return x>=0&&

Vijos P1360 八数码问题

题目链接:https://vijos.org/p/1360 题目大意: 3x3格子上放1~8数字,一个空位,每次空位可与上下左右交换,固定终止布局,求输入的起始布局需要几步到达终止布局 题目思路: 一眼题BFS,宽搜即可,判重我比较暴力直接把状态记下,没hash.cantor什么的. 1 // 2 //by coolxxx 3 // 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #incl

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

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

八皇后(DFS)

题目描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. 输入 第1行是测试数据的

团体程序设计天梯赛-练习集(八)(DFS,7-37 整数分解为若干项之和)

7-22 龟兔赛跑 (20分) https://pintia.cn/problem-sets/14/problems/802 1 #include <iostream> 2 #include <cmath> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 int main() 7 { 8 int dis_tur=0,dis_rab=0; 9 int T,t1=0,t2=0

BZOJ 1853 SCOI2010 幸运数字 容斥原理+DFS

题目大意:求[l,r]区间内有多少个数是只由6和8组成的数的倍数 同2393 链接:http://blog.csdn.net/popoqqq/article/details/41807333 此题数据强力了一些 由于r<=10^10 所以计算LCM的时候会爆long long 于是我们可以用double求出LCM的近似值与r进行比较 如果小于r再取精确值进行计算 此外就是搜索的时候要从大到小搜 从小到大会TLE #include <cstdio> #include <cstring

10月刷题总结

(写的题真少QAQ 动态规划: [vijos]1286 座位安排(状压dp) [BZOJ]1026: [SCOI2009]windy数(数位dp) [BZOJ]1596: [Usaco2008 Jan]电话网络(树形dp+特殊的技巧) [BZOJ]1827: [Usaco2010 Mar]gather 奶牛大集会(树形dp) [BZOJ]2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛(树形dp) 计数: [vijos]1789 String(组合计数+奇怪的题)

HDU 5024 Wang Xifeng&#39;s Little Plot(2014广州网络赛1003)

写了1h的DFS,简直被自己的代码吓哭了..不过起码还是思路清晰,QUQ~ 说一下题意吧: 题意是求一条最长路,最多能经过一次转弯,并且其角度只能为90度. 拿第一个样例来说:(0,1)->(1,2)->[转弯](2,1) ,所以答案是3. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5024 代码如下: #include<iostream> #include<cstdio> #include<cstring>