【P1813】8的倍数

容斥原理,居然没想到……要补一下数论了

原题:

小x最近对数字8很感兴趣,有8进制,2008奥运会之类的。
现在小x想知道,在[x,y]区间里,有多少个数能被8整除。
小y觉得题目太简单,于是给出n个其他数,问在[x,y]区间里,有多少个数能被8整除且不能被这n个数整除。

1≤n≤15,1≤x≤y≤10^9,N个数全都小于等于10^4大于等于1。

x-y区间这个问题,可以搞前缀和,求1-(x-1)和1-y,然后减

枚举2^n种 n个因子是否使用 的情况,然后搞8和 当前情况使用因子 的lcm,用x-1或y除这个lcm,得到在这个范围内能被lcm整除的有几个,如果用了奇数个,答案就减,偶数个就加

搞lcm的时候,如果lcm已经大于x-1或y,就不用再往下搞

代码;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 using namespace std;
 7 int gcd(int x,int y){return (y)?gcd(y,x%y):x;}
 8 int n,a[20],xx,yy;
 9 bool use[20];
10 int ansx,ansy,bowl=0;
11 void dfs(int x,int y){
12     if(x>n){
13         long long lcm=8;  int ge=0;
14         for(int i=1;i<=n;i++)if(use[i]){
15             lcm*=a[i]/gcd(lcm,a[i]);
16             if(lcm>y)  break;
17             ge++;
18         }
19         if(ge%2)  bowl-=y/lcm;
20         else  bowl+=y/lcm;
21         return ;
22     }
23     use[x]=false;  dfs(x+1,y);
24     use[x]=true;  dfs(x+1,y);
25 }
26 int main(){//freopen("ddd.in","r",stdin);
27     memset(use,0,sizeof(use));
28     cin>>n;
29     for(int i=1;i<=n;i++)  cin>>a[i];
30     cin>>xx>>yy;
31     dfs(1,yy);  ansy=bowl;
32     bowl=0;
33     dfs(1,xx-1);  ansx=bowl;
34     cout<<ansy-ansx<<endl;
35     return 0;
36 }

时间: 2024-08-30 08:07:28

【P1813】8的倍数的相关文章

倍数处理,

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>倍数处理</title></head><body>    </body><script type="text/javascript">                var sum

51nod 1616 最小集合(枚举倍数)

分析:也就是取任意多个数,它们的最大公约数都在这个集合里.考虑到ai比较小,可以枚举小于a中最大值的所有数,判断是否为其中若干个数的gcd.记c[k]为a中k的倍数的个数,然后枚举k的倍数i*k,c[i]<2直接跳过,如果c[i*k]==c[k],说明k的那些倍数也同时是i*k的倍数,k就可以不在集合中,反之,如果任意i,c[i*k]<c[k],说明存在一个倍数和其它k的倍数的gcd是k,所以k一定在集合中.两次枚举倍数,复杂度为O(nlogn). 1 #include<iostream

51Nod 1433 0和5(9的倍数理论)

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1433 思路: 数论中关于9的倍数的理论:若是一个数能被9整除,则各位数之和为9的倍数. 因为这题是90的倍数,所以至少得有一个0. 分别统计0和5的个数,9个5相加的话就是9的倍数,计算出能有几个9个5,剩下的0全排最后就可以了. 1 #include<iostream> 2 #include<algorithm> 3 #include<cstrin

1109 01组成的N的倍数

1109 01组成的N的倍数 基准时间限制:1 秒 空间限制:131072 KB 给定一个自然数N,找出一个M,使得M > 0且M是N的倍数,并且M的10进制表示只包含0或1.求最小的M. 例如:N = 4,M = 100. Input 输入1个数N.(1 <= N <= 10^6) Output 输出符合条件的最小的M. Input示例 4 Output示例 100和http://www.cnblogs.com/zzuli2sjy/p/5731745.html一样: 1 #includ

Integer Game(UVA11489)3的倍数

K - Integer Game Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 11489 题意:在n中取数字,使剩下的数是3的倍数,不能取则失败. 思路:如果能使当前数为3的倍数,数字和必是3的倍数.要保持这种状态,先对每一位对3取余,统计cnt[0],cnt[1],cnt[2]; 的个数,整个串能否被3整除取决于ans=(cnt[1]+cnt[

001. 3和5的倍数

Problem 1: Multiples of 3 and 5 If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000. 意思就是让你算出在1000以下的3或者5的倍数之和. 我的pyt

1284 2 3 5 7的倍数

分析: 此题是典型的容斥原理题,一开始理解错误,写成了丑数题,反正一直超时,后来才发现: 要求不是2,3,5,7的倍数的个数,可以先求出2,3,5,7的个数,之后通过n减去2,3,5,7的倍数的个数可求得不是2,3,5,7的倍数的个数: 而要知道2,3,5,7的倍数的个数,只需要分别知道2的倍数个数,3的倍数个数,5的倍数个数,7的倍数的个数,之后通过容斥原理(先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果既无遗漏又无重复,这

POJ 1426 Find The Multiple(寻找倍数)

p.MsoNormal { margin-bottom: 10.0000pt; font-family: Tahoma; font-size: 11.0000pt } h1 { margin-top: 5.0000pt; margin-bottom: 5.0000pt; text-align: left; font-family: 宋体; font-weight: bold; font-size: 24.0000pt } span.10 { font-family: "Times New Rom

1103 N的倍数

1103 N的倍数 题目来源: Ural 1302 基准时间限制:1 秒 空间限制:131072 KB 一个长度为N的数组A,从A中选出若干个数,使得这些数的和是N的倍数. 例如:N = 8,数组A包括:2 5 6 3 18 7 11 19,可以选2 6,因为2 + 6 = 8,是8的倍数. Input 第1行:1个数N,N为数组的长度,同时也是要求的倍数.(2 <= N <= 50000) 第2 - N + 1行:数组A的元素.(0 < A[i] <= 10^9) Output