HDU 4135 Co-prime (容斥原理+质因数分解)

这题只要知道质因数的性质就很容易做了。任意一个正整数(除了1)都可以分解成有限个质数因子的乘积。

那么假如两个数互质,那么这两个数肯定至少各有一个对方没有的质因子。所以若一个数跟n不互质,那么这个的数的质因子肯定也都属于n的质因子,那么就用容斥原理求出所有跟n不互质的所有数的个数。然后再用总的减去即可。

代码如下:

#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <algorithm>
#include <stdlib.h>
#include <map>
#include <set>
#include <stdio.h>
using namespace std;
#define LL __int64
const int mod=1e9+7;
const int INF=0x3f3f3f3f;
LL c[2000], tot, ans1, ans2, a, b;
void dfs(int cur, int cnt, LL tmp)
{
        tmp*=c[cur];
        if(cnt&1) {
                ans1+=a/tmp;
                ans2+=b/tmp;
        } else {
                ans1-=a/tmp;
                ans2-=b/tmp;
        }
        for(int i=cur+1; i<tot; i++) {
                dfs(i,cnt+1,tmp);
        }
}
int main()
{
        int t, i, j, num=0;
        LL n;
        scanf("%d",&t);
        while(t--) {
                num++;
                scanf("%I64d%I64d%I64d",&a,&b,&n);
                a--;
                tot=0;
                for(i=2; i*i<=n; i++) {
                        if(n%i==0) {
                                c[tot++]=i;
                                while(n%i==0) n/=i;
                        }
                }
                if(n>1)
                    c[tot++]=n;
                ans1=ans2=0;
                for(i=0; i<tot; i++)
                        dfs(i,1,1);
                printf("Case #%d: ",num);
                printf("%I64d\n",(b-ans2)-(a-ans1));
        }
        return 0;
}
时间: 2024-11-01 01:24:59

HDU 4135 Co-prime (容斥原理+质因数分解)的相关文章

HDU 1695 GCD 欧拉函数+容斥原理+质因数分解

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695 题意:在[a,b]中的x,在[c,d]中的y,求x与y的最大公约数为k的组合有多少.(a=1, a <= b <= 100000, c=1, c <= d <= 100000, 0 <= k <= 100000) 思路:因为x与y的最大公约数为k,所以xx=x/k与yy=y/k一定互质.要从a/k和b/k之中选择互质的数,枚举1~b/k,当选择的yy小于等于a/k时,可以

HDU 1695 GCD (容斥原理+质因数分解)

先进行预处理,对每一个数分解质因数. 然后将因为若gcd(x,y)==z,那么gcd(x/z,y/z)==1,又因为不是z的倍数的肯定不是,所以不是z的倍数的可以直接去掉,所以只要将b和d除以k,然后就转化成了求两个范围中互质的对数了.这时候可以枚举1~b,然后用容斥原理找1~d范围内的与枚举数互质的数的个数,为了避免重复,只要再限定下大小关系就可以了,具体见代码. 代码如下: #include <iostream> #include <string.h> #include <

HDU 4135 Co-prime(容斥原理 + 基础数论)

传送门 Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3695    Accepted Submission(s): 1461 Problem Description Given a number N, you are asked to count the number of integers between A an

hdu 4135 Co-prime【容斥原理】

Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1668    Accepted Submission(s): 636 Problem Description Given a number N, you are asked to count the number of integers between A and B

HDU - 1019 - Least Common Multiple - 质因数分解

http://acm.hdu.edu.cn/showproblem.php?pid=1019 LCM即各数各质因数的最大值,搞个map乱弄一下就可以了. #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned int ui; map<ui,ui> M; ll _pow(ui f,ui s){ ll res=1; while(s){ res*=f; s--; } retur

poj 1365 Prime Land 质因数分解

#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int primeNUM[] = { 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,

[容斥原理] hdu 4135 Co-prime

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4135 Co-prime Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1176    Accepted Submission(s): 427 Problem Description Given a number N, you are a

HDU 3988 n!质因数分解

Harry Potter and the Hide Story Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2324    Accepted Submission(s): 569 Problem Description iSea is tired of writing the story of Harry Potter, so, l

LightOJ 1356 Prime Independence(质因数分解+最大独立集+Hopcroft-Carp)

http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1356 题意: 给出n个数,问最多能选几个数,使得该集合中的任意两个数中其中一个数不是另一个质数倍. 思路: 二分图的最大独立集. 那么怎么建图呢?我们按照质因数的奇偶性来分成两部分建图,如果两个数是质数倍的关系,那么就连边,最后最大独立集=点数-最大匹配. 对每个数进行质因数分解,存储每个质因数和质因数的总数,比如说P,质因数为x1,x2,x3...接下来