• HDU4135(容斥原理)


    Co-prime

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


    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
     
    思路:求1~m中与n互素的数的个数。
    #include <cstdio>
    #include <vector>
    using namespace std;
    typedef long long LL;
    LL sieve(LL m,LL n)
    {
        vector<LL> divisor;
        for(LL i=2;i*i<=n;i++)
        {
            if(n%i==0)
            {
                divisor.push_back(i);
                while(n%i==0)    n/=i;
            }
        }
        if(n>1)    divisor.push_back(n);
        LL ans=0;
        for(LL mark=1;mark<(1<<divisor.size());mark++)
        {
            LL odd=0;
            LL mul=1;
            for(LL i=0;i<divisor.size();i++)
            {
                if(mark&(1<<i))
                {
                    mul*=divisor[i];
                    odd++;
                }
            }
            LL cnt=m/mul;
            if(odd&1)    ans+=cnt;
            else ans-=cnt;
        }
        return m-ans;
    }
    LL a,b,n;
    int main()
    {
        int T;
        scanf("%d",&T);
        for(int cas=1;cas<=T;cas++)
        {
            scanf("%lld%lld%lld",&a,&b,&n);
            LL res=sieve(b,n)-sieve(a-1,n);
            printf("Case #%d: ",cas);
            printf("%lld
    ",res);
        }
        return 0;
    }
  • 相关阅读:
    215. 数组中的第K个最大元素
    c++集合的操作
    201. 数字范围按位与
    150. 逆波兰表达式求值
    二叉树的遍历算法
    144. 二叉树的前序遍历
    139. 单词拆分 DP
    131. 分割回文串
    695. 岛屿的最大面积 DFS
    leetcode 200. 岛屿数量 DFS
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5813053.html
Copyright © 2020-2023  润新知