博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1695 GCD 欧拉函数+容斥定理
阅读量:6806 次
发布时间:2019-06-26

本文共 1400 字,大约阅读时间需要 4 分钟。

输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1

由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和1到d/k 2个区间 如果第一个区间小于第二个区间 讲第二个区间分成2部分来做1-b/k 和 b/k+1-d/k

第一部分对于每一个数i 和他互质的数就是这个数的欧拉函数值 全部数的欧拉函数的和就是答案

第二部分能够用全部数减去不互质的数 对于一个数i 分解因子和他不互质的数包括他的若干个因子 这个用容斥原理 奇加偶减

#include 
#include
#include
using namespace std;typedef __int64 LL;const int maxn = 100010;LL phi[maxn];LL sum[maxn], p[maxn][33];void phi_table(int n){ memset(sum, 0, sizeof(sum)); memset(phi, 0, sizeof(phi)); phi[1] = 1; for(int i = 2; i <= n; i++) { if(!phi[i]) for(int j = i; j <= n; j += i) { if(!phi[j]) phi[j] = j; phi[j] = phi[j] / i * (i-1); p[j][sum[j]++] = i; } phi[i] += phi[i-1]; }}void dfs(int id, LL num, LL cnt, int a, LL& ans, int x){ if(id == sum[x]) { if(cnt == 0) return; if(cnt&1) ans += a/num; else ans -= a/num; return; } dfs(id+1, num*p[x][id], cnt+1, a, ans, x); dfs(id+1, num, cnt, a, ans, x);}LL cal(int x, int a){ LL ans = 0; dfs(0, 1, 0, a, ans, x); return ans;}int main(){ phi_table(100000); int cas = 1; int T; scanf("%d", &T); while(T--) { int a, b, k; scanf("%d %d %d %d %d", &a, &a, &b, &b, &k); if(!k) { printf("Case %d: %d\n", cas++, 0); continue; } if(a > b) swap(a, b); a /= k; b /= k; LL ans = phi[a]; for(int i = a+1; i <= b; i++) ans += a-cal(i, a); printf("Case %d: %I64d\n", cas++, ans); } return 0;}

转载地址:http://rwtwl.baihongyu.com/

你可能感兴趣的文章
机器学习初学者入门实践:怎样轻松创造高精度分类网络
查看>>
Ruby Tip:定义索引操作符
查看>>
优云automation实践技巧:简单4步完成自动化构建与发布
查看>>
【Android 】【Monkey Demons】 针对性的进行稳定性测试
查看>>
基于MongoDB与NodeJS构建物联网系统
查看>>
从云效1.0到2.0的升级,看技术如何驱动企业提效
查看>>
Struts2升级版本至2.5.10,高危漏洞又来了
查看>>
OpenCV 使用 FLANN 库实现特征匹配
查看>>
SOA webservice
查看>>
学习shell的第三天
查看>>
用Dart搭建HTTP服务器(2)
查看>>
Mysql + keepalived 实现双主热备读写分离
查看>>
kvm虚拟化学习笔记(十七)之KVM到KVM之v2v迁移
查看>>
zephir-(1)开篇介绍
查看>>
使用邮件客户端整合日常信息
查看>>
地址转换函数
查看>>
【转载】架构师的行为准则(三)
查看>>
Ubuntu上snmp安装、配置、启动及远程测试完整过程
查看>>
高斯模糊的算法
查看>>
委托的那些事
查看>>