zoukankan      html  css  js  c++  java
  • B

     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
    ",s);
    //        se.clear();
        }
        return 0;
    }
  • 相关阅读:
    20191208浙江自然博物馆寒武纪迸发专题展
    Spring Crest-英特尔出品的神经网络训练场景加速卡
    20191203动物园玉皇山凤凰山南宋皇城遗址凤凰山玉皇山动物园
    博观而约取-观展攻略
    20191130周六浙江美术馆纤维艺术特展
    git clone下载速度很慢的解决方法
    Jupyter notebook使用技巧积累
    (转)Python--matplotlib绘图可视化知识点整理
    Pygame一些不错教程平时收集....
    pygame.Surface.get_at
  • 原文地址:https://www.cnblogs.com/Accepting/p/11358150.html
Copyright © 2011-2022 走看看