容斥原理!!
这题首先要去掉=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 ",cal()); 58 } 59 return 0; 60 }