zoukankan      html  css  js  c++  java
  • poj2773 容斥原理

      这个题的意思是给你两个数m, k, 让你求出与m互质的第k个数, 设想对于一个数r,我们可以求出小于等于r与m互质的数的个数, 那么我们就可以使用二分很快的求解。 假设我们把m唯一分解 m = p1^a1 * p2^a2 * ... * pi^ai, 那么小于等于r与m互质的数中不应该有p1 p2 .. pi这些因子, 因此问题转化成求解小于等于r且不含有p1, p2 p3 .. pi因子的数的个数, 这可以使用容斥原理来接觉, 假设Ai是不含有因子Pi的数的个数那么答案就是 r - (A1+A2+ .. Ai) + (Ai并Aj i!=j) -  ... Ai = r/pi. 代码如下:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <iostream>
    
    using namespace std;
    typedef long long LL;
    const int maxn = 100000 + 10;
    int m, k;
    int pi[maxn], npi;
    bool vis[maxn];
    int prime[maxn], num;
    void shai(int n)
    {
        memset(vis, 0, sizeof(vis));
        int m = sqrt(n+0.5);
        for(int i=2; i<=m; i++) if(!vis[i])
            for(int j=i*i; j<=n; j+=i) vis[j] = 1;
        num = 0;
        for(int i=2; i<=n; i++) if(vis[i] == 0)
            prime[num++] = i;
    }
    
    LL check(LL r)   //求解r中与m互质的数目
    {
        LL res = r;
        for(int i=1; i<(1<<npi); i++)
        {
            int bits=0, sum=1;
            for(int j=0; j<npi; j++)
                if(((i>>j)&1)==1) bits++, sum*=pi[j];
            if(bits%2==1) res -= r/sum;
            else res += r/sum;
        }
        return res;
    }
    
    int main()
    {
        shai(100000);
    
        while(cin>>m>>k)
        {
            npi = 0;
            int tp = m;
            for(int i=0; i<num; i++)
            {
                if(tp%prime[i] == 0)
                {
                    pi[npi++] = prime[i];
                    while(tp%prime[i]==0) tp/=prime[i];
                }
                if(tp == 1) break;
            }
            if(tp != 1) pi[npi++] = tp;
            LL l=1, r=0x3f3f3f3f3f3f3f3f;
            LL res = 1;
            while(l <= r)
            {
                LL mid = (l+r)/2;
                if(check(mid)>=k)
                {
                    res = mid;
                    r = mid-1;
                }
                else l = mid + 1;
            }
            cout<<res<<endl;
        }
        return 0;
    }
  • 相关阅读:
    iOS中Zbar二维码扫描的使用
    SOJ 1135. 飞跃原野
    SOJ 1048.Inverso
    SOJ 1219. 新红黑树
    SOJ 1171. The Game of Efil
    SOJ 1180. Pasting Strings
    1215. 脱离地牢
    1317. Sudoku
    SOJ 1119. Factstone Benchmark
    soj 1099. Packing Passengers
  • 原文地址:https://www.cnblogs.com/xingxing1024/p/5215243.html
Copyright © 2011-2022 走看看