题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1695

题意:x位于区间[a, b],y位于区间[c, d],求满足GCD(x, y) = k的(x, y)有多少组,不考虑顺序。

思路:a = c = 1简化了问题,原问题可以转化为在[1, b/k]和[1, d/k]这两个区间各取一个数,组成的数对是互质的数量,不考虑顺序。我们让d > b,我们枚举区间[1, d/k]的数i作为二元组的第二位,因为不考虑顺序我们考虑第一位的值时,只用考虑小于i的情况。对于i<=b,因为第一位[1, i]都可以取到,互质的对数就是欧拉函数值。现在考虑i位于[b/k+1, d/k],此时我们要用b - [1, b/k]中与i不互质数的个数,那么关键问题就是求[1, b/k]中与i不互质数的个数,我们将i分解质因子,在b/k范围内每个因子的倍数肯定与i不互质。设i的素因子分别的p1,p2...pk,则1..b/k中p1的倍数组成集合A1,p2的倍数组成集合A2,p3到A3.....pk到Ak, 由于集合中会出现重复的元素,所以用容斥原理来求A1并A2并A3.....并Ak的元素的数的个数。区间中与i不互质的个数 = (区间中i的每个质因数的倍数个数)-(区间中i的每两个质因数乘积的倍数)+(区间中i的每3个质因数的乘积的倍数个数)-(区间中i的每4个质因数的乘积)+ ...

code:

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int MAXN = ; LL phi[MAXN]; // 欧拉函数的和
int num[MAXN]; // 素因子个数
int p[MAXN][]; // 素因子 void init()
{
memset(phi, , sizeof(phi));
memset(num, , sizeof(num));
phi[] = 1L;
for (int i = ; i < MAXN; ++i) {
if (!phi[i]) {
for (int j = i; j < MAXN; j += i) {
if (!phi[j]) phi[j] = j;
phi[j] = phi[j] * (i - ) / i;
p[j][num[j]++] = i;
}
}
phi[i] += phi[i - ];
}
} LL dfs(int idx, int b, int now) // 求不大于b的数中,与now不互质的数的个数;
{
LL ret = ;
for (int i = idx; i < num[now]; ++i) { // 容斥原理来求A1并A2并A3.....并Ak的元素的数的个数
ret += b / p[now][i] - dfs(i + , b / p[now][i], now);
}
return ret;
} int main()
{
init();
int nCase;
scanf("%d", &nCase);
for (int cas = ; cas <= nCase; ++cas) {
int a, b, c, d, k;
scanf("%d %d %d %d %d", &a, &b, &c, &d, &k);
if (k == ) {
printf("Case %d: 0\n", cas);
continue;
}
if (b > d) swap(b, d);
b /= k;
d /= k;
LL ans = phi[b];
for (int i = b + ; i <= d; ++i) {
ans += b - dfs(, b, i); // 求不大于b的数中,与i不互质的数的个数
}
printf("Case %d: %lld\n", cas, ans);
}
return ;
}

最新文章

  1. qq加好友加群限制ip怎么解决
  2. bzoj 3531 旅行
  3. 用Qt Creator 对 leveldb 进行简单的读写
  4. linux下进程权限分析
  5. java画图程序_图片用字母画出来_源码发布_版本二
  6. 我已看过的TVB剧集目录(陆续更新)
  7. ASP.NET运行原理_2
  8. Using HTML5 audio and video
  9. Win7下配置Django+Apache+mod_wsgi+Sqlite
  10. jQuery 在Table中选择input之类的东西注意事项
  11. 1638: [Usaco2007 Mar]Cow Traffic 奶牛交通
  12. mysql的常用引擎
  13. gulp填坑记(二)——gulp多张图片自动合成雪碧图
  14. python程序—系统检测
  15. [转]java List和数组相互转换方法
  16. # 20175120 2018.3.3 《Java程序设计》第1周学习总结
  17. windows 10 64bit下安装Tensorflow+Keras+VS2015+CUDA8.0 GPU加速
  18. MUI---上传头像功能实现
  19. Core Java 2
  20. iOS 模拟器截屏快捷键

热门文章

  1. 深入理解java虚拟机---读后笔记(垃圾回收)
  2. CSS3 旋转3D立方体
  3. SQL 语句优化—— (一) 操作符优化
  4. Gridpanel多种操作帮助文档
  5. no data type for node
  6. windows下nginx+tomcat分布式集群部署
  7. 使用sql语句创建表、修改表、添加列等
  8. 条件注释+JS实现各版本IE浏览器className
  9. Codeigniter使用phpexcel
  10. 转: javascript模块加载框架seajs详解