给定两个数b,d,问[1,b]和[1,d]区间上有多少对互质的数。(x,y)和(y,x)算一个。

对于[1,b]部分,用欧拉函数直接求。对于大于b的部分,求n在[1,b]上有多少个互质的数,用容斥原理。

主要学习容斥原理的写法,本题使用DFS。容斥原理复杂度比较高,是指数复杂度。

输出长整型不能用lld,必须用I64d。

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int a, b, c, d, k;
bool isPrime[maxn];
ll euler[maxn];
ll sumeuler[maxn];
int p[maxn][20], ps[maxn];
void initPrimes(){
memset(isPrime, 1, sizeof(isPrime));
for (int i = 1; i < maxn; i++){
euler[i] = i;
}
for (int i = 2; i < maxn; i++){
if (isPrime[i]){
for (int j = i; j < maxn; j += i){
isPrime[j] = false;
p[j][ps[j]++] = i;
euler[j] = euler[j] * (i - 1) / i;
}
}
}
sumeuler[1] = 1;
for (int i = 2; i < maxn; i++){
sumeuler[i] = sumeuler[i - 1] + euler[i];
}
}
ll dfs(int ind, int n, int x){//容斥原理核心代码
ll s = 0;
for (int i = ind; i < ps[x]; i++){
s += n / p[x][i] - dfs(i + 1, n / p[x][i], x);
}
return s;
}
ll huzhi(int n, int x){//0~n之间,与x互质的数字个数
return n - dfs(0, n, x);
}
int main(){
freopen("in.txt", "r", stdin);
initPrimes();
int caseCount;
scanf("%d", &caseCount);
for (int caseid = 1; caseid <= caseCount; caseid++){
scanf("%d%d%d%d%d", &a, &b, &c, &d, &k);
ll ans;
if (k == 0)
ans = 0;
else{
if (b > d)swap(b, d);
b /= k, d /= k;
ans = sumeuler[b];
for (int i = b + 1; i <= d; i++){
ans += huzhi(b, i);
}
}
printf("Case %d: %I64d\n", caseid, ans);
}
return 0;
}

容斥原理的另一种写法:

int calc(int n,int m)//n < m,求1-n内和m互质的数的个数
{
getFactors(m);
int ans = 0;
for(int i = 1;i < (1<<fatCnt);i++)
{
int cnt = 0;
int tmp = 1;
for(int j = 0;j < fatCnt;j++)
if(i&(1<<j))
{
cnt++;
tmp *= factor[j][0];
}
if(cnt&1)ans += n/tmp;
else ans -= n/tmp;
}
return n - ans;
}

容斥原理项的个数为2的幂次,肯定不会太大,所以一定可以用一个int来表示所有情况。

本题还可以用莫比乌斯反演来解决。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int MAXN = 1e5 + 7;
typedef long long ll;
bool isprime[MAXN];
int prime[MAXN], psize;
int mu[MAXN];
ll euler[MAXN], sumeuler[MAXN];
void init(){
memset(isprime, false, sizeof(isprime));
mu[1] = euler[1] = sumeuler[1] = 1;
psize = 0;
for (int i = 2; i <= MAXN; i++) {
if (!isprime[i]) {
prime[psize++] = i;
mu[i] = -1;
euler[i] = i - 1;
}
for (int j = 0; j < psize&&i*prime[j] < MAXN; j++) {
isprime[i * prime[j]] = true;
if (i % prime[j] == 0) {
mu[i * prime[j]] = 0;
euler[i*prime[j]] = euler[i] * prime[j];
break;
}
else {
mu[i * prime[j]] = -mu[i];
euler[i*prime[j]] = euler[i] * (prime[j] - 1);
}
}
sumeuler[i] = sumeuler[i - 1] + euler[i];
}
}
ll eu(int b){
long long ans2 = 0;
for (int i = 1; i <= b; i++)
ans2 += (long long)mu[i] * (b / i)*(b / i);
return ans2;
}
void debug(){
for (int i = 1; i < MAXN; i++){
if (eu(i) / 2 != sumeuler[i] - 1)
cout <<i<<" "<< eu(i) / 2 << " " << sumeuler[i] - 1 << endl;
}
exit(0);
}
int main(){
freopen("in.txt", "r", stdin);
int T;
int a, b, c, d, k;
init();
//debug();
scanf("%d", &T);
int iCase = 0;
while (T--)
{
iCase++;
scanf("%d%d%d%d%d", &a, &b, &c, &d, &k);
if (k == 0) {
printf("Case %d: 0\n", iCase);
continue;
}
b /= k; d /= k;
if (b > d)swap(b, d);
long long ans1 = 0;
for (int i = 1; i <= b; i++)
ans1 += (long long)mu[i] * (b / i)*(d / i);
//这里ans2表示重复的部分,这部分可以用欧拉函数直接求,完全不需要for循环,但是提交却是wa,经过本机检测,完全没有问题
long long ans2 = 0;
for (int i = 1; i <= b; i++)
ans2 += (long long)mu[i] * (b / i)*(b / i);
ans1 -= ans2 / 2;
//ans1 -= (sumeuler[b] - 1);
printf("Case %d: %I64d\n", iCase, ans1);
}
return 0;
}

hdu1695 容斥原理 莫比乌斯反演的更多相关文章

  1. HDU1695 GCD(莫比乌斯反演)

    传送门 看了1个多小时,终于懂了一点了 题目大意:给n,m,k.求gcd(x,y) = k(1<=x<=n, 1<=y<=m)的个数 思路:令F(i)表示i|gcd(x,y)的 ...

  2. hdu1695(莫比乌斯反演)

    传送门:GCD 题意:求[1,n],[1,m]gcd为k的对数. 分析:莫比乌斯入反演门题,gcd(x,y)==k等价于gcd(x/k,y/k)==1,求出[1,n][1,m]互质的对数,在减去[1, ...

  3. BZOJ 2440 中山市选2011 全然平方数 二分答案+容斥原理+莫比乌斯反演

    题目大意:求第k个无平方因子数是多少(无视原题干.1也是全然平方数那岂不是一个数也送不出去了? 无平方因子数(square-free number),即质因数分解之后全部质因数的次数都为1的数 首先二 ...

  4. hdu1695 GCD 莫比乌斯反演做法+枚举除法的取值 (5,7),(7,5)看做同一对

    /** 题目:hdu1695 GCD 链接:http://acm.hdu.edu.cn/status.php 题意:对于给出的 n 个询问,每次求有多少个数对 (x,y) , 满足 a ≤ x ≤ b ...

  5. BZOJ2005: [Noi2010]能量采集(容斥原理 莫比乌斯反演)

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 4727  Solved: 2877[Submit][Status][Discuss] Descript ...

  6. [HAOI2011][bzoj2301] Problem b [莫比乌斯反演+容斥原理+分块前缀和优化]

    题面: 传送门 有洛谷就尽量放洛谷链接呗,界面友好一点 思路: 和HDU1695比较像,但是这一回有50000组数据,直接莫比乌斯反演慢慢加的话会T 先解决一个前置问题:怎么处理a,c不是1的情况? ...

  7. BZOJ2301: [HAOI2011]Problem b[莫比乌斯反演 容斥原理]【学习笔记】

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 4032  Solved: 1817[Submit] ...

  8. 【BZOJ-2440】完全平方数 容斥原理 + 线性筛莫比乌斯反演函数 + 二分判定

    2440: [中山市选2011]完全平方数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2371  Solved: 1143[Submit][Sta ...

  9. hdu1695 莫比乌斯反演

    莫比乌斯反演:可参考论文:<POI XIV Stage.1 <Queries>解题报告By Kwc-Oliver> 求莫比乌斯函数mu[i]:(kuangbin模板) http ...

随机推荐

  1. css3 transform方法常用属性

    css3中transform方法是一个功能强大的属性,可以对元素进行移动.缩放.转动.拉长或拉伸等功能. transform中最为常用的4个属性分别是:rotate();.scale();.skew( ...

  2. [ GIT ] GIT tip : A simple .gitconfig file

    reference : http://fle.github.io/git-tip-a-simple-gitconfig-file.html As several friends have asked ...

  3. STL队列 之FIFO队列(queue)、优先队列(priority_queue)、双端队列(deque)

    1.FIFO队列   std::queue就是普通意思上的FIFO队列在STL中的模版. 1.1主要的方法有: (1)T front():访问队列的对头元素,并不删除对头元素 (2)T back(): ...

  4. jQuery中开发插件的两种方式(附Demo)

    做web开发的基本上都会用到jQuery,jQuery插件开发两种方式:一种是类扩展的方式开发插件,jQuery添加新的全局函数(jQuery的全局函数是属于jQuery命名空间的函数),如果将jQu ...

  5. Remove Nth Node From End of List leetcode java

    题目: Given a linked list, remove the nth node from the end of list and return its head. For example, ...

  6. Android制作曲线、柱状图、饼形等图表——使用AChartEngine

    之前在java开发中实现图表使用JFreeChar组件,最近有个小项目要求在Android端进行数据分析,如何实现图表呢?查了一下google提供了一个开源组件Achartengine非常好用,可实现 ...

  7. Redis自学笔记 --string类型

    string类型                                                                                  set 赋值 get ...

  8. Mac Finder中如何复制当前完整路径

    1.拖到命令行 2.在Finder中command+i 会弹出详细信息,然后[位置]处进行 copy 3.利用Automator,添加一个服务的快捷键. 转自:http://q.cnblogs.com ...

  9. Endv 博客简介

    Endv 博客简介 此博客收集了 C++.Android.C#.java.php 等优秀的开源项目, 同时也对 Windows.Linux.CentOS 等系列操作系统的开发环境.办公环境的配置写了一 ...

  10. Python-__builtin__与__builtins__的区别与关系(超详细,经典)(转)

    Python-__builtin__与__builtins__的区别与关系(超详细,经典) (2013-07-23 15:27:32) 转载▼   分类: Python 在学习Python时,很多人会 ...