首页 > 代码库 > HDU 1796

HDU 1796

呃,我竟然傻了,同时被a且b整除的个数为n/(a*b)。

其实应该是n/[a,b]才对,是他们的最小公倍数啊。。。

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;__int64 ans;__int64 set[30];__int64 n;int m;__int64 gcd(__int64 a,__int64 b){	if(b==0) return a;	return gcd(b,a%b);}void dfs(int i,int num,__int64 tmp){	if(i>=m){		if(num==0){			ans=0;		}		else {			if(num&1){				ans=(ans+n/tmp);			}			else{				ans=ans-n/tmp;			}		}		return ;	}	dfs(i+1,num,tmp);	dfs(i+1,num+1,tmp*set[i]/gcd(tmp,set[i]));}int main(){	bool flag;	while(scanf("%I64d%d",&n,&m)!=EOF){		n--;		flag=true;		int k=0;		for(int i=0;i<m;i++){			scanf("%I64d",&set[i]);			if(set[i])			set[k++]=set[i];		}		m=k;		ans=0;		dfs(0,0,1);		printf("%I64d\n",ans);	}	return 0;}

  

HDU 1796