题意:已知给定k,x,y求 1<=a<=x 1<=b<=y 中满足 gcd(a,b)=k 的(a,b)对数。(注意数对是无序的)。 1<=x,y<=1e5, 0<=k<=1e5

用到了欧拉函数,素因子分解,筛选法,组合数学上的容斥原理等,不失为一道好题!!!

大体思路:

有一个小小的变形:在[1...b/k]中选x,在[1....d/k]中选y,使gcd(x,y)=k,求不重复的对数

我们让d>=b;  然后在[1....d/k]进行枚举,对于每一个i,我们只要在1...min(i-1,b)中找到与i互质数,记录个数,然后累加就得到结果了

当i<=b/k时,我们可以直接用欧拉函数计算出与i互质的个数 (当然要先进行因子分解,才能求欧拉函数)

当b/k<i<=d/k时,就比较难求了,我们用b/k减去与i不互质的数的个数得到,求与i不互质的数的个数时就用到容斥原理,设i的素因子分别的p1,p2...pk,则1..b/k中p1的倍数组成集合A1,p2的倍数组成集合A2,p3到A3.....pk到Ak, 由于集合中会出现重复的元素, 所以用容斥原理来求A1并A2并A3.....并Ak的元素的数的个数.

容斥原理的具体如下:

如果i因子个数num[i]为0,即i为素数,则区间中与i不互质的个数是0

否则,区间中与i不互质的个数 = (区间中i的每个质因数的倍数个数)-(区间中i的每两个质因数乘积的倍数)+(区间中i的每3个质因数的乘积的倍数个数)-(区间中i的每4个质因数的乘积)+...

于是问题变成了统计每个数的不同质因数的个数而忽略次数。这个可以用筛法。具体做法如下:

对每个数保存一个真质因数的列表。初始每个列表的长度为0。然后从2开始,分别检查每个数的列表长度,如果列表长度不为0,则这个数是合数,跳过;如果这个长度为0,则我们找到了一个质数,同时再把这个数的倍数(不包含本身)的列表里加入这个数。

用到了欧拉函数,素因子分解,筛选法,组合数学上的容斥原理等,也不失为一道好题!!!

题目意思好懂,在[1...b]中选x,在[1....d]中选y,使gcd(x,y)=k,求不重复的对数

有一个小小的变形:在[1...b/k]中选x,在[1....d/k]中选y,使gcd(x,y)=k,求不重复的对数

我们让d>=b;  然后在[1....d/k]进行枚举,对于每一个i,我们只要在1...min(i-1,b)中找到与i互质数,记录个数,然后累加就得到结果了

当i<=b/k时,我们可以直接用欧拉函数计算出与i互质的个数 (当然要先进行因子分解,才能求欧拉函数)

当b/k<i<=d/k时,就比较难求了,我们用b/k减去与i不互质的数的个数得到,求与i不互质的数的个数时就用到容斥原理,设i的素因子分别的p1,p2...pk,则1..b/k中p1的倍数组成集合A1,p2的倍数组成集合A2,p3到A3.....pk到Ak, 由于集合中会出现重复的元素, 所以用容斥原理来求A1并A2并A3.....并Ak的元素的数的个数.

这算是一道比较复杂的数论题了,参照了大牛门的代码....没办法自己没有能力想出来;

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define N 100005
typedef long long ll;
vector<int> x[N];
bool is[N];void prime() {memset(is, false, sizeof(is));for (int i=0; i<N; i++) x[i].clear();for (int j=2; j<N; j+=2) x[j].push_back(2);for (int i=3; i<N; i+=2)if (!is[i]) {for (int j=i; j<N; j+=i) {is[j] = true;x[j].push_back(i);}}
}
int work(int u, int s, int w) {int cnt = 0, v = 1;for (int i=0; i<x[w].size(); i++) {if ((1<<i) & s) {cnt++;v *= x[w][i];}}int all = u/v;if (cnt % 2 == 0) return -all;else return all;
}int main() {prime();int T, a, b, c, d, k;scanf("%d", &T);for (int cas=1; cas<=T; cas++) {scanf("%d%d%d%d%d", &a, &b, &c, &d, &k);if (k == 0) {printf("Case %d: 0\n", cas);continue;}b /= k, d /= k;if (b > d) { a = b; b = d; d = a; }long long ans = 0;for (int i=1; i<=d; i++) {k = min(i, b);ans += k;for (int j=1; j<(1<<x[i].size()); j++)ans -= work(k, j, i);}printf("Case %d: %I64d\n", cas, ans);}return 0;
}

HDU 1695(数论,筛选+素因子分解+容斥)相关推荐

  1. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

  2. HDU 2841 Visible Trees(容斥)题解

    题意:有一块(1,1)到(m,n)的地,从(0,0)看能看到几块(如果两块地到看的地方三点一线,后面的地都看不到). 思路:一开始是想不到容斥...后来发现被遮住的地都有一个特点,若(a,b)有gcd ...

  3. HDU 6143 Killer Names【容斥定理】【排列组合】

    题目来戳呀 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  4. HDU 6143 Killer Names(容斥+组合)

    #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...

  5. HDU - 5468 Puzzled Elena (容斥/莫比乌斯)

    做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...

  6. hdu 5072 Coprime(同色三角形+容斥)

    http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜的一道题,要是知道这个模型....就 ...

  7. HDU 6143 Killer Names(排列+容斥,dp)

    Killer Names HDU 6143 (容斥+排列组合,dp+整数快速幂) 2017ACM暑期多校联合训练 - Team 8 1011 Killer Names 题目链接 Time Limit: ...

  8. POJ 1150 The Last Non-zero Digit 数论+容斥

    POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址:  POJ 1150 题意:  求排列P(n, m)后面第一个非0的数. 分析: 为了熟悉题目中的理论.我先做了 ...

  9. Visible Trees HDU - 2841(容斥)

    Visible Trees HDU - 2841 题意: 大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点. 题解: 容斥做法参考 这个题和AcWin ...

最新文章

  1. oracle 默认表空间 10g,Oracle10g 表空间管理
  2. 某程序员哀叹:二本计算机,4年开发,年包才40多万。二本真的不如985/211吗?
  3. 从公司发展看技术人才需求
  4. 编译安装Apache2.4.10
  5. php_DBHelper
  6. 实战:Redis 慢查询
  7. mysql 本地登录失败 - 已授权
  8. 谈谈有什么方法可以快捷实现多场景下的线程安全
  9. PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
  10. @bean 什么时候执行_写好一个Spring组件的实现步骤是什么?
  11. ****** 三十 ******、软设笔记【计算机体系结构】-循环冗余校验码(CRC)
  12. Debian 9 安装配置 Caddy Server
  13. iotop监视磁盘I/O
  14. MIKE水动力笔记6_如何自己制作实测数据的时间序列文件dfs0
  15. 信捷plc485通信上位机_STM32L476R快速入门——串口与上位机通信
  16. 五险一金 | 2020年企业社保缴费为零问题
  17. matlab黄金分割实例,实战案例教你黄金分割
  18. 康师傅被“水和面”糊住了眼睛?
  19. 隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(五)
  20. android安装包解析错误

热门文章

  1. HTMLCSS登录界面及讲解
  2. linux下挂载光驱方法,Linux下光驱挂载技巧
  3. rop检查_他山之石丨详解抗VEGF治疗在ROP诊疗中的应用
  4. Mac上安装R语言运行环境及RStudio [超详细!~]
  5. golang中椭圆曲线密码
  6. 将实时三维计算机技术,基于结构光实时三维重建计算机应用技术专业论文.docx...
  7. T5 模型:NLP Text-to-Text 预训练模型+数据清洗
  8. Parasoft案例研究:医疗器械软件验证与合规性
  9. Micro SD 卡(TF卡) spi 模式实现方法
  10. 【免费资源必备】LingoDeer,扫描全能王直装版等五款APP让你享受上千个免费资源