• hdu 3388二分 容斥原理


    复习容斥原理(其实当时就没学会,看到的题,拿出来再研究一下方便日后复习,

    题意:给三个数m,n,k, 0<m,n,k<10^9,求与m,n同时互质的第k个正整数(按从小到达顺序排列).

     
    这里本质的问题就是容斥原理的最基础的应用,求1-n中与x互质的数有多少,如果知道这个的解法,那么不就是n*m就是x,二分n就可以了,
    这里n*m肯定不行,所以分开分解unique一下就行了。。
     
    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    long gcd(long long a,long long b){
        return b==0?a:gcd(b,a%b);
    }
    
    vector<long long> v;
    int num=0;
    
    void prime(long long n){
        for(long long i=2;i*i<=n;i++){
            if(n%i==0){
                v.push_back(i);
                while(n%i==0){
                    n=n/i;
                }
            }
        }
        if(n>1)
            v.push_back(n);
        return;
    }
    
    long long dfs(int idx,long long n){
        long long ret=0;
        for(int i=idx;i<num;i++){
            ret+=n/v[i]-dfs(i+1,n/v[i]);
        }
        return ret;
    }
    
    void solve(long long s,long long t,long long k){
        long long l=s,r=t;
        while(l<=r){
            long long mid=(l+r)/2;
            if(mid-dfs(0,mid)<k) l=mid+1;
            else r=mid-1;
        }
        cout<<l<<endl;
        return;
    }
    
    int main()
    {
        long long t;
        long long a,b,k;
        long long cas=1;
        cin>>t;
        while(t--){
            cin>>a>>b>>k;
            long long g=a*b/gcd(a,b);
            v.clear();
            prime(a);
            prime(b);
            sort(v.begin(),v.end());
            num=unique(v.begin(),v.end())-v.begin();
            cout<<"Case "<<cas++<<": ";
            long long t=1e18+5;
            solve(1,t,k);
        }
    }
    


  • 相关阅读:
    图片 滚动切换效果(五) 高级篇
    图片 滚动切换效果(四)
    图片 滚动切换效果(三)
    图片 滚动切换效果(二)
    图片 滚动切换效果(一)
    新年第一篇 之 (摄像机可视区域)
    SuperSocket源码解析之开篇 (转)
    矮人国之战 之 阵型 模仿(二)
    Web Service
    XML于JSON
  • 原文地址:https://www.cnblogs.com/zhangxianlong/p/10672582.html
Copyright © 2020-2023  润新知