[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=1101

[算法]

首先 , 问题可以转化为求GCD(x,y) = 1,x <= a / d , y <= b / d,的二元组个数

令F(a,b,d)表示x <= a , y <= b , d | GCD(x,y)的二元组个数 , 显然 , 只需保证x和y都为d的倍数即可 , 因此 , F(a,b,d) = [a / d][b / d](其中,"[]"表示向下取整)

那么 , 要求互质的二元组个数 , 可以通过容斥原理进行计算 :

在没有限制的情况下 , 共有a * b对二元组 , 需要将答案减去公约数是2 , 3 , 5 , 7等素数的倍数的二元组 , 但这样会多减了如公约数为2且3的倍数的二元组 , 需要加上它。

不难发现 , Answer = sigma( miu(i) * F(a,b,i) )(1 <= i <= min(a,b) , miu为莫比乌斯函数)

可以通过数论分块快速计算 , 时间复杂度 : O(T * (sqrt(A) + sqrt(B)) ( 其中,sqrt表示开根号)

#include<bits/stdc++.h>
using namespace std;
#define MAXN 50010 int T,a,b,d;
int miu[MAXN],sum[MAXN]; inline void sieve()
{
static bool visited[MAXN];
for (int i = ; i < MAXN; i++)
{
visited[i] = false;
miu[i] = ;
}
for (int i = ; i < MAXN; i++)
{
if (visited[i]) continue;
miu[i] = -;
for (int j = * i; j < MAXN; j += i)
{
visited[j] = true;
if ((j / i) % i == ) miu[j] = ;
else miu[j] *= -;
}
}
for (int i = ; i < MAXN; i++) sum[i] = sum[i - ] + miu[i];
}
inline int getsum(int l,int r)
{
return sum[r] - sum[l - ];
}
inline int solve(int x,int y)
{
int gi;
int ret = ;
for (int i = ; i <= min(x,y); i = gi + )
{
gi = min((x / (x / i)),(y / (y / i)));
ret += (x / i) * (y / i) * getsum(i,gi);
}
return ret;
} int main()
{ scanf("%d",&T);
sieve();
while (T--)
{
scanf("%d%d%d",&a,&b,&d);
printf("%d\n",solve(a / d,b / d));
} return ; }

[POI 2007] Zap的更多相关文章

  1. BZOJ 1101 Luogu P3455 POI 2007 Zap (莫比乌斯反演+数论分块)

    手动博客搬家: 本文发表于20171216 13:34:20, 原地址https://blog.csdn.net/suncongbo/article/details/78819470 URL: (Lu ...

  2. [POI 2007]ZAP-Queries

    Description Byteasar the Cryptographer works on breaking the code of BSA (Byteotian Security Agency) ...

  3. 解题:POI 2007 Tourist Attractions

    题面 事实上这份代码在洛谷过不去,因为好像要用到一些压缩空间的技巧,我并不想(hui)写(捂脸) 先预处理$1$到$k+1$这些点之间相互的最短路和它们到终点的最短路,并记录下每个点能够转移到时的状态 ...

  4. 解题:POI 2007 Driving Exam

    题面 有点意思的题 从一个位置$i$出发可以到达每一个位置即是从$1,n$出发可以到达$i$.然后有了一个做法:把图上下反转后建反图,这样就可以求从一个点$i$到达左右两侧的花费$dp[i][0/1] ...

  5. 解题:POI 2007 Weights

    题面 这是个$O(nlog^2$ $n)$的解法,因为蒟蒻博主没有看懂$O(nlog$ $n)$的更优秀的解法 显然从小到大装砝码是最优的方法,又显然从大到小装容器不会使得答案变劣,还显然砝码数具有单 ...

  6. [POI 2007] 办公楼

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1098 [算法] 显然 , 答案为补图的连通分量个数 用链表优化BFS , 时间复杂度 ...

  7. [POI 2007] 堆积木

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1109 [算法] DP [代码] #include<bits/stdc++.h& ...

  8. 【POI 2007】 山峰和山谷

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1102 [算法] 广度优先搜索 [代码] #include<bits/stdc+ ...

  9. [POI 2007] 旅游景点

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1097 [算法] 首先,用Dijkstra算法求出2-k+1到每个点的最短路 然后,我 ...

随机推荐

  1. cookie domain path 跨域

    1.domain表示的是cookie所在的域,默认为请求的地址,如网址为www.jb51.net/test/test.aspx,那么domain默认为www.jb51.net.而跨域访问,如域A为t1 ...

  2. HDU - 2050 - 折线分割平面(数学 + dp)

    题意: 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分 思路: 记住结论.. ...

  3. Gym - 101550A(Artwork 倒序+并查集)

    题目: 思路: 1.对输入数据离线,先把所有的黑线都画出来,统计一下剩余的白色连通块的个数,dfs过程将一个连通块放到一个集合中. 2.倒着往前消去黑线,如果当前的块A是白块就看他的四周有没有白块:有 ...

  4. 瑞芯微ROCK960 RK3399烧录image后扩容rootfs

    问题描述: RK3399开发板烧录官网提供的ubuntu镜像: Ubuntu 16.04 Server arm64(下载地址:https://www.96boards.org/documentatio ...

  5. centos下kong源码安装

    参考资料: https://docs.konghq.com/install/source/ 环境准备:操作系统 centeros7.3 1 :openssl和pcre一般系统自带,如果没有可自己安装  ...

  6. 1002 A+B for Polynomials (PAT (Advanced Level) Practice)

    This time, you are supposed to find A+B where A and B are two polynomials. Input Specification: Each ...

  7. 00 大王警语--be_a_new_gentleman

    大王博客:https://www.cnblogs.com/alex3714/ # 表面层次# 1,着装特体(服饰的牌子中高端)# 2,每天洗澡# 3,适当用香水# 4,女士优先# 5,不随地吐痰.不乱 ...

  8. 关于python字典中文显示的处理办法

    最近工作中遇到字典包含中文,显示\uxxxx的问题,怎么转换都无法输入正常的中文:{"gc": "\u4eba\u751f\u7f8e\u597d", &quo ...

  9. HTTP 请求的 GET 与 POST 方式的区别

    HTTP 请求的 GET 与 POST 方式的区别 在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST. GET - 从指定的资源请求数据. POST - 向指定的资源 ...

  10. poj 1562 简单深搜

    //搜八个方向即可 #include<stdio.h> #include<string.h> #define N 200 char ma[N][N]; int n,m,vis[ ...