hdu1796 容斥原理dfs

 1 #include<stdio.h>
 2 #include<string.h>
 3 long long int ans,n;
 4 int cnt,a[25];
 5 long long int gcd(long long int x,long long int y)
 6 {
 7     if (y==0) return x;
 8     return gcd(y,x%y);
 9 }
10 void dfs(int now,int flag,long long bei)
11 {
12     if (flag) ans+=n/bei;
13     else ans-=n/bei;
14     for (int i=now+1;i<=cnt;i++)
15         dfs(i,1-flag,a[i]/gcd(a[i],bei)*bei);
16 }
17 int main()
18 {
19     int m,i;
20     while (~scanf("%I64d%d",&n,&m))
21     {
22         cnt=0;
23         for (i=1;i<=m;i++)
24         {
25             scanf("%d",&a[i]);
26             if (a[i]!=0) {cnt++; a[cnt]=a[i]; }
27         }
28         ans=0; n--;
29         for (i=1;i<=cnt;i++) dfs(i,1,a[i]);
30         printf("%I64d\n",ans);
31     }
32 }

http://acm.hdu.edu.cn/showproblem.php?pid=1796

posted on 2014-09-04 20:40  xiao_xin  阅读(115)  评论(0编辑  收藏  举报

导航