HDU 1695(数论,筛选+素因子分解+容斥)
题意:已知给定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(数论,筛选+素因子分解+容斥)相关推荐
- 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了
容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...
- HDU 2841 Visible Trees(容斥)题解
题意:有一块(1,1)到(m,n)的地,从(0,0)看能看到几块(如果两块地到看的地方三点一线,后面的地都看不到). 思路:一开始是想不到容斥...后来发现被遮住的地都有一个特点,若(a,b)有gcd ...
- HDU 6143 Killer Names【容斥定理】【排列组合】
题目来戳呀 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- HDU 6143 Killer Names(容斥+组合)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> ...
- HDU - 5468 Puzzled Elena (容斥/莫比乌斯)
做了好几个容斥了,一直找不到feel,这个做完在现在有一点感觉了.虽然刚开始也不会.但就是发现感觉不一样了. 首先,不考虑树的关系,单纯给出一个m,还有一个集合(里面数字任意),求集合里面跟m互质的数 ...
- hdu 5072 Coprime(同色三角形+容斥)
http://acm.hdu.edu.cn/showproblem.php?pid=5072 单色三角形模型 现场赛和队友想了3个小时,最后发现想跑偏了.感觉好可惜的一道题,要是知道这个模型....就 ...
- HDU 6143 Killer Names(排列+容斥,dp)
Killer Names HDU 6143 (容斥+排列组合,dp+整数快速幂) 2017ACM暑期多校联合训练 - Team 8 1011 Killer Names 题目链接 Time Limit: ...
- POJ 1150 The Last Non-zero Digit 数论+容斥
POJ 1150 The Last Non-zero Digit 数论+容斥 题目地址: POJ 1150 题意: 求排列P(n, m)后面第一个非0的数. 分析: 为了熟悉题目中的理论.我先做了 ...
- Visible Trees HDU - 2841(容斥)
Visible Trees HDU - 2841 题意: 大概就是有个m*n个点的矩形从(1,1)到(m,n),问从(0,0)出发直线看过去最多能看到几个点. 题解: 容斥做法参考 这个题和AcWin ...
最新文章
- oracle 默认表空间 10g,Oracle10g 表空间管理
- 某程序员哀叹:二本计算机,4年开发,年包才40多万。二本真的不如985/211吗?
- 从公司发展看技术人才需求
- 编译安装Apache2.4.10
- php_DBHelper
- 实战:Redis 慢查询
- mysql 本地登录失败 - 已授权
- 谈谈有什么方法可以快捷实现多场景下的线程安全
- PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
- @bean 什么时候执行_写好一个Spring组件的实现步骤是什么?
- ****** 三十 ******、软设笔记【计算机体系结构】-循环冗余校验码(CRC)
- Debian 9 安装配置 Caddy Server
- iotop监视磁盘I/O
- MIKE水动力笔记6_如何自己制作实测数据的时间序列文件dfs0
- 信捷plc485通信上位机_STM32L476R快速入门——串口与上位机通信
- 五险一金 | 2020年企业社保缴费为零问题
- matlab黄金分割实例,实战案例教你黄金分割
- 康师傅被“水和面”糊住了眼睛?
- 隔壁孩子10篇博客node入门而且写了一个前后端分离项目,你怎么还在睡觉!!!(五)
- android安装包解析错误
热门文章
- HTMLCSS登录界面及讲解
- linux下挂载光驱方法,Linux下光驱挂载技巧
- rop检查_他山之石丨详解抗VEGF治疗在ROP诊疗中的应用
- Mac上安装R语言运行环境及RStudio [超详细!~]
- golang中椭圆曲线密码
- 将实时三维计算机技术,基于结构光实时三维重建计算机应用技术专业论文.docx...
- T5 模型:NLP Text-to-Text 预训练模型+数据清洗
- Parasoft案例研究:医疗器械软件验证与合规性
- Micro SD 卡(TF卡) spi 模式实现方法
- 【免费资源必备】LingoDeer,扫描全能王直装版等五款APP让你享受上千个免费资源