呃,我竟然傻了,同时被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; }
时间: 2024-11-02 12:25:09