呃,我竟然傻了,同时被a且b整除的个数为n/(a*b)。
其实应该是n/[a,b]才对,是他们的最小公倍数啊。。。
#include#include #include 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