zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    java实现 n人过桥问题
    git:rebase的原理
    注解@ConfigurationProperties使用方法
    docker+mysql 更改配置后重启不了的解决方案
    docker+mysql 构建数据库的主从复制
    Linux 踩坑记
    OSS上传图片无法在线预览的解决方案
    Linux中du、df显示不一致问题
    zookeeper作配置中心(存储支付信息)
    @Configuration结合@Bean实现对象的配置
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5813053.html
Copyright © 2011-2022 走看看