P18138的倍数

Posted cdcq(本博客废弃!现用博客:https://www.cn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P18138的倍数相关的知识,希望对你有一定的参考价值。

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

原题:

小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 }
View Code

 

以上是关于P18138的倍数的主要内容,如果未能解决你的问题,请参考以下文章

将 JavaScript 字符串拆分为固定长度的片段

pythomn中输出1-100中7的倍数代码怎么打

Python图像resize前后颜色不一致问题

python颜色压缩的结果颜色比保存颜色深

这个看似过度设计的代码检查一个数字是另一个数字的倍数的原因是啥?

显示范围内给定数字的倍数