题意:

给一个N。然后给M个数,问1~N-1里面有多少个数能被这M个数中一个或多个数整除。

思路:

首先要N--

然后对于每一个数M 事实上1~N-1内能被其整除的 就是有(N-1)/M[i]个

可是会出现反复 比方 例子 6就会被反复算

这时候我们就须要容斥原理了

加上一个数的减去两个数的。。

这里要注意了 两个数以上的时候 是求LCM而不是简单的相乘!

代码:

#include "stdio.h"
#include "string.h"
#include "math.h"
#include "iostream"
#include "cstdlib"
#include "algorithm"
#include "queue"
using namespace std;
int a[12];
int used[12],b[12];
int n,m;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int lcm(int k)
{
int ans=b[0];
for(int i=1;i<k;i++)
{
int tep=gcd(ans,b[i]);
ans=ans/tep*b[i];
}
return ans;
}
__int64 dfs(int kk,int x,int lit)
{
__int64 ans=0;
if(x==lit)
{
int tep;
tep=lcm(x);
return n/tep;
}
for(int i=kk+1;i<m;i++)
{
if(a[i]==0) continue;
if(used[i]) continue;
used[i]=1;
b[x]=a[i];
ans+=dfs(i,x+1,lit);
used[i]=0;
}
return ans;
}
int main()
{
while(scanf("%d%d",&n,&m)!=-1)
{
n--;
for(int i=0;i<m;i++) scanf("%d",&a[i]);
__int64 ans=0;
for(int i=1;i<=m;i++)
{
// printf("%d\n",dfs(-1,0,i));
memset(used,0,sizeof(used));
if(i%2==0) ans-=dfs(-1,0,i);
else ans+=dfs(-1,0,i);
}
printf("%I64d\n",ans);
}
return 0;
}

最新文章

  1. [Keras] Develop Neural Network With Keras Step-By-Step
  2. Unable to find vcvarsall.bat的解决办法
  3. SpringMVC解析4-DispatcherServlet逻辑脉络
  4. JDK环境变量解析
  5. 生成N个不相等的随机数
  6. UIScrollView控件详解
  7. mongodb debug
  8. C++_bool
  9. Treasure Exploration(二分最大匹配+floyd)
  10. Unicode 字符集与它的编码方式
  11. PHP中使用CURL(五)
  12. redux计算器
  13. mavne的创建
  14. Markdown编辑技巧
  15. FTP连接池
  16. EM算法(Expectation Maximization Algorithm)初探
  17. xls添加 序号列技巧
  18. 唯一分解定理(以Minimun Sum LCM UVa 10791为例)
  19. ssh 登录出现Are you sure you want to continue connecting (yes/no)?解决方法
  20. vuex 的使用

热门文章

  1. poj1778 All Discs Considered
  2. MAGENTO 插件
  3. C#压缩文件夹至zip,不包含所选文件夹【转+修改】
  4. C#基础知识面试经典[整理]
  5. GC策略
  6. Vue核心知识-computed和watch的使用场景和方法
  7. CodeFrist基础
  8. find命令查找和替换
  9. c# Dictionary 扩展方法
  10. cgroup代码浅析(1)