hdu 1796 How many integers can you find

容斥原理!!

这题首先要去掉=0和>=n的值,然后再使用容斥原理解决

我用的是数组做的……

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<algorithm>
 4 #include<iomanip>
 5 #include<cmath>
 6 #include<string>
 7 #include<vector>
 8 #define ll __int64
 9 using namespace std;
10 int an[11],n,m,num,a[11];
11 ll gcd(int a,int b)
12 {
13     int t;
14     if(a<b) swap(a,b);
15     while(b)
16     {
17         t=a;
18         a=b;
19         b=t%b;
20     }
21     return a;
22 }
23 ll lcm(int a,int b)
24 {
25     return a/gcd(a,b)*b;
26 }
27 ll cal()
28 {
29     ll quene[10000],sum=0;
30     int t=0,k,i,j;
31     quene[t++]=-1;
32     for(i=0;i<num;i++)
33     {
34         k=t;
35         for(j=0;j<k;j++)
36         {
37             if(quene[j]<0)
38                 quene[t++]=lcm(-quene[j],an[i]);
39             else quene[t++]=(-1)*lcm(quene[j],an[i]);
40         }
41     }
42     for(i=1;i<t;i++)
43         sum+=(n-1)/quene[i];
44     return sum;
45 }
46 int main()
47 {
48     int i,j,t,k;
49     while(cin>>n>>m)
50     {
51         num=0;k=0;
52         for(i=0;i<m;i++)
53         {
54             cin>>t;
55             if(t>0&&t<n)  an[num++]=t;
56         }
57         printf("%I64d\n",cal());
58     }
59     return 0;
60 }
View Code

 

 

posted @ 2013-07-23 13:43  _随心所欲_  阅读(169)  评论(0编辑  收藏  举报