Now you get a number N, and a M-integers set, you should find out how many integers which are small than N, that they can divided exactly by any integers in the set. For example, N=12, and M-integer set is {2,3}, so there is another set {2,3,4,6,8,9,10}, all the integers of the set can be divided exactly by 2 or 3. As a result, you just output the number 7.
Input There are a lot of cases. For each case, the first line contains two integers N and M. The follow line contains the M integers, and all of them are different from each other. 0<N<2^31,0<M<=10, and the M integer are non-negative and won’t exceed 20.Output For each case, output the number.Sample Input
12 2 2 3
Sample Output
7
被这个题卡了很久,主要是有个坑和一个一个知识漏洞
题目最欧一句话描述的不太清晰,,他的意思是输入的M的整数中可能有0;
还有就是判断一个数在n前面的数中充当因子的次数时,可以直接用n除以这个数,但是判断多个数时,共同充当因子的次数时,要用n除以这几个数的最小公倍数
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<set> using namespace std; typedef long long ll; ll arr[100]; //set<ll>se; //set<ll>::iterator it; int main(){ ll n,m; while(scanf("%lld%lld",&n,&m)!=EOF) { ll x,pos=0; for(int i=1;i<=m;i++){ scanf("%lld",&x); if(x!=0){ // se.insert(x); pos++; arr[pos]=x; } } // // ll pos=0; // for(it=se.begin();it!=se.end();it++){ // pos++; // arr[pos]=*it; // } // ll s=0; for(int i=1;i<(1<<pos);i++){ ll cnt =0,sum=1; for(int j=0;j<pos;j++){ if(1&(i>>j)){ // sum*=arr[j+1]; sum=(sum*arr[j+1])/__gcd(sum,arr[j+1]); cnt++; } } if(cnt&1){ s+=n/sum; } else { s-=n/sum; } } for(int i=1;i<=pos;i++) if(n%arr[i]==0){ s--; break; } printf("%lld\n",s); // se.clear(); } return 0; }