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;
    }
  • 相关阅读:
    iOS-Core Text 入门
    Mac浏览器全屏设置
    Quartz 2D - 图形上下文(Graphics Contexts)
    Quartz 2D 概述
    Quartz 2D官方文档翻译(持续更新中)
    那些年,我们常掉进去的坑
    CGAffineTransformMake(a,b,c,d,tx,ty) 矩阵运算的原理 (转载)
    科大讯飞
    Object-C语言类的扩展
    科大讯飞语音识别
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5813053.html
Copyright © 2011-2022 走看看