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;
    }
  • 相关阅读:
    【算法】CDQ分治 -- 三维偏序 & 动态逆序对
    【题解】ZJOI2007报表统计
    【乱七八糟】兰陵王
    【题解】NOI2017游戏
    【题解】JSOI2010满汉全席
    【题解】NOI2014动物园
    【题解】HNOI2010合唱队
    【题解】SDOI2010地精部落
    cf 843 D Dynamic Shortest Path [最短路+bfs]
    cf 843 B Interactive LowerBound [随机化]
  • 原文地址:https://www.cnblogs.com/Accepting/p/11358150.html
Copyright © 2011-2022 走看看