zoukankan      html  css  js  c++  java
  • HDU 4135 Coprime (容斥原理)

    Co-prime

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 626    Accepted Submission(s): 234

    Problem Description
    Given a number N, you are asked to count the number of integers between A and B inclusive which are relatively prime to N. Two integers are said to be co-prime or relatively prime if they have no common positive divisors other than 1 or, equivalently, if their greatest common divisor is 1. The number 1 is relatively prime to every integer.
     
    Input
    The first line on input contains T (0 < T <= 100) the number of test cases, each of the next T lines contains three integers A, B, N where (1 <= A <= B <= 1015) and (1 <=N <= 109).
     
    Output
    For each test case, print the number of integers between A and B inclusive which are relatively prime to N. Follow the output format below.
     
    Sample Input
    2
    1 10 2
    3 15 5
     
    Sample Output
    Case #1: 5
    Case #2: 10
    Hint
    In the first test case, the five integers in range [1,10] which are relatively prime to 2 are {1,3,5,7,9}.
     
    Source
     
    Recommend
    lcy
     
     
     
     

    题意:给定a、b、c,求a到b区间内与c互质的数。

    思路:

    通常我们求1~n中与n互质的数的个数都是用欧拉函数! 但如果n比较大或者是求1~m中与n互质的数的个数等等问题, 要想时间效率高的话还是用容斥原理!

    容斥、先对n分解质因数,分别记录每个质因数, 那么所求区间内与某个质因数不互质的个数就是n / r(i),假设r(i)是r的某个质因子 假设只有三个质因子, 总的不互质的个数应该为p1+p2+p3-p1*p2-p1*p3-p2*p3+p1*p2*p3, 及容斥原理,可以转向百度百科查看相关内容 pi代表n/r(i),即与某个质因子不互质的数的个数 ,当有更多个质因子的时候, 可以用状态压缩解决,二进制位上是1表示这个质因子被取进去了。 如果有奇数个1,就相加,反之则相减

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<vector>
    
    using namespace std;
    
    long long a,b,n;
    vector<long long> vt;
    
    long long solve(long long x,long long n){
        vt.clear();
        long long i,j;
        for(i=2;i*i<=n;i++)     //对n进行素数分解
            if(n%i==0){
                vt.push_back(i);
                while(n%i==0)
                    n/=i;
            }
        if(n>1)
            vt.push_back(n);
    
        long long sum=0,val,cnt;
        for(i=1;i<(1<<vt.size());i++){  //用二进制来1,0来表示第几个素因子是否被用到,如m=3,三个因子是2,3,5,则i=3时二进制是011,表示第2、3个因子被用到
            val=1;
            cnt=0;
            for(j=0;j<vt.size();j++)
                if(i&(1<<j)){       //判断第几个因子目前被用到 
                    val*=vt[j];
                    cnt++;
                }
            if(cnt&1)       //容斥原理,奇加偶减
                sum+=x/val;
            else
                sum-=x/val;
        }
        return x-sum;
    }
    
    int main(){
    
        //freopen("input.txt","r",stdin);
    
        int t,cases=0;
        scanf("%d",&t);
        while(t--){
            cin>>a>>b>>n;
            cout<<"Case #"<<++cases<<": "<<solve(b,n)-solve(a-1,n)<<endl;
        }
        return 0;
    }

     

  • 相关阅读:
    Android——继续深造——从安装Android Studio 2.0开始(详)
    PHP——安装wampserver丢失MSVCR110.dll
    Marza Gift for GDC 2016
    Retrieve OpenGL Context from Qt 5.5 on OSX
    Space Time Varying Color Palette
    Screen Space Depth Varying Glow based on Heat Diffusion
    Visualization of Detail Point Set by Local Algebraic Sphere Fitting
    Glass Dragon
    Jump Flood Algorithms for Centroidal Voronoi Tessellation
    京都之行
  • 原文地址:https://www.cnblogs.com/jackge/p/2995238.html
Copyright © 2011-2022 走看看