题目描述

  • 给出n,m,l,r,modn,m,l,r,modn,m,l,r,mod
  • 表示一个(n+1)∗(m+1)(n+1)*(m+1)(n+1)∗(m+1)的格点图,求能够互相看见的点对个数对modmodmod取模的值.
  • 能互相看见定义为此两点连线上没有其他的格点且欧氏距离在[l,r]范围内
  • n,m&lt;=100000l,r&lt;=150000mod&lt;=109n,m&lt;=100000\newline l,r&lt;=150000\newline mod&lt;=10^9n,m<=100000l,r<=150000mod<=109
题目分析
  • 首先我们将上下左右相邻的点对特判:

    当l&lt;=1&lt;=rl&lt;=1&lt;=rl<=1<=r时有(2nm+n+m)(2nm+n+m)(2nm+n+m)个上下左右相邻点对对答案造成贡献

  • 此时我们只需要找出某个长宽互质矩形的对角线(两条)能够对答案造成多少贡献即可,如图,在长宽为(5,3)(5,3)(5,3)的矩形中,长宽为(1,2)(1,2)(1,2)的子矩形的副对角线对答案造成了((5+1)−1)((3+1)−2)((5+1)-1)((3+1)-2)((5+1)−1)((3+1)−2)的贡献:



    所以在求某个矩形造成的总贡献时就用一条对角线的贡献乘以222即可

    Ans=2∑x=1n∑y=1m[(x,y)==1](n+1−x)(m+1−y)Ans = 2\sum_{x=1}^n\sum_{y=1}^m[(x,y)==1](n+1-x)(m+1-y)Ans=2x=1∑n​y=1∑m​[(x,y)==1](n+1−x)(m+1−y)

    =2∑x=1n((n+1−x)∑d∣xμ(d)∑d∣ym(m+1−y))=2\sum_{x=1}^n((n+1-x)\sum_{d|x}\mu(d)\sum_{d|y}^m(m+1-y))=2x=1∑n​((n+1−x)d∣x∑​μ(d)d∣y∑m​(m+1−y))

    =2∑x=1n((n+1−x)∑d∣xμ(d)∑y=1⌊md⌋(m+1−yd))=2\sum_{x=1}^n((n+1-x)\sum_{d|x}\mu(d)\sum_{y=1}^{⌊\frac md⌋}(m+1-yd))=2x=1∑n​((n+1−x)d∣x∑​μ(d)y=1∑⌊dm​⌋​(m+1−yd))

    由于∑y=1⌊nd⌋(m+1−yd)\sum_{y=1}^{⌊\frac nd⌋}(m+1-yd)∑y=1⌊dn​⌋​(m+1−yd)可以Θ(1)\Theta(1)Θ(1)求

    所以Θ(n)\Theta(n)Θ(n)枚举xxx,Θ(n)\Theta(\sqrt n)Θ(n​)枚举d即可

    总时间复杂度Θ(nn)\Theta(n\sqrt n)Θ(nn​)

Tips
  • 此处还有[l,r]的限制,首先考虑[1,k]怎么做

    只用满足x2+y2&lt;=k2x^2+y^2&lt;=k^2x2+y2<=k2即可



    Ans(k2)=2∑x=1n((n+1−x)∑d∣xμ(d)∑y=1⌊min(m,k2−x2)d⌋(m+1−yd))Ans(k^2)=2\sum_{x=1}^n((n+1-x)\sum_{d|x}\mu(d)\sum_{y=1}^{⌊\frac {min(m,\sqrt{k^2-x^2})}d⌋}(m+1-yd))Ans(k2)=2x=1∑n​((n+1−x)d∣x∑​μ(d)y=1∑⌊dmin(m,k2−x2​)​⌋​(m+1−yd))
  • 对于[l,r][l,r][l,r],答案就是Ans(r2)−Ans(l2−1)Ans(r^2)-Ans(l^2-1)Ans(r2)−Ans(l2−1)

    此处不能用rrr与l−1l-1l−1作为参数代进去,因为两点距离的值域为RRR,不一定为整数,会多减一部分答案

AC code

#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int n, m, mod, l, r, ans; int Prime[MAXN], Cnt, mu[MAXN];
bool IsnotPrime[MAXN];
void init()
{
mu[1] = 1;
for(int i = 2; i < MAXN; ++i)
{
if(!IsnotPrime[i])
Prime[++Cnt] = i, mu[i] = -1;
for(int j = 1; j <= Cnt && Prime[j] * i < MAXN; ++j)
{
IsnotPrime[Prime[j] * i] = 1;
if(i % Prime[j] == 0)
{
mu[Prime[j] * i] = 0;
break;
}
mu[Prime[j] * i] = -mu[i];
}
}
} inline int F(int k, int d)
{
return (1ll * k * (m+1) % mod - 1ll * d * ((1ll*k*(k+1)/2) % mod) % mod) % mod;
} inline int solve(long long k) // y*y <= k*k - x*x
{
int ret = 0;
for(int x = 1; x <= n && 1ll*x*x < k; ++x)
{
int s = 0, up = min(m, int(sqrt(1.0*k-1.0*x*x)));
for(int d = 1, d2; d*d <= x; ++d) if(x % d == 0)
{
s = (s + 1ll * mu[d] * F(up/d, d) % mod) % mod;
if(d != (d2=x/d))
s = (s + 1ll * mu[d2] * F(up/d2, d2) % mod) % mod;
}
ret = (ret + 1ll * s * (n+1-x) % mod) % mod;
}
return 2ll * ret % mod;
} int main ()
{
scanf("%d%d%d%d%d", &n, &m, &l, &r, &mod); init();
int Ans = ((solve(1ll*r*r)-solve(1ll*l*l-1)) % mod + mod) % mod;
if(l <= 1 && 1 <= r) Ans = (Ans + ((2ll * n * m % mod + n) % mod + m) % mod) % mod;
printf("%d\n", Ans);
}

[bzoj 3701] Olympic Games (莫比乌斯反演)的更多相关文章

  1. bzoj 2820 / SPOJ PGCD 莫比乌斯反演

    那啥bzoj2818也是一样的,突然想起来好像拿来当周赛的练习题过,用欧拉函数写掉的. 求$(i,j)=prime$对数 \begin{eqnarray*}\sum_{i=1}^{n}\sum_{j= ...

  2. BZOJ 2440 完全平方数(莫比乌斯反演+二分查找)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=23362 题意:定义含有平方数因子的数为完全平方数(平方数因子不包含 ...

  3. BZOJ 3259 [Sdoi2014]数表 (莫比乌斯反演 + 树状数组)

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2321  Solved: 1187[Submit][Status ...

  4. 【BZOJ】2693: jzptab 莫比乌斯反演

    [题意]2154: Crash的数字表格 莫比乌斯反演,多组询问,T<=10000. [算法]数论(莫比乌斯反演) [题解]由上一题, $ans=\sum_{g\leq min(n,m)}g\s ...

  5. BZOJ 3529 [Sdoi2014]数表 (莫比乌斯反演+树状数组+离线)

    题目大意:有一张$n*m$的数表,第$i$行第$j$列的数是同时能整除$i,j$的所有数之和,求数表内所有不大于A的数之和 先是看错题了...接着看对题了发现不会做了...刚了大半个下午无果 看了Po ...

  6. BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

    Description 对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. Input 第一行一个整数 ...

  7. BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]

    3529: [Sdoi2014]数表 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1399  Solved: 694[Submit][Status] ...

  8. BZOJ 2301 Problem b (莫比乌斯反演+容斥)

    这道题和 HDU-1695不同的是,a,c不一定是1了.还是莫比乌斯的套路,加上容斥求结果. 设\(F(n,m,k)\)为满足\(gcd(i,j)=k(1\leq i\leq n,1\leq j\le ...

  9. Bzoj 2190 仪仗队(莫比乌斯反演)

    题面 bzoj 洛谷 题解 看这个题先大力猜一波结论 #include <cstdio> #include <cstring> #include <algorithm&g ...

随机推荐

  1. phaser三个学生做题目

    3个学生一起参加考试,一共有三道题,要求所有学生到齐才能开始考试,全部同学都做完第一题,学生才能继续做第二题,全部学生做完了第二题,才能做第三题,所有学生都做完的第三题,考试才结束 public cl ...

  2. MongoDB的Shell操作

    前言 本文从介绍了MongoShell 的配置.脚本.数据类型和其他指令. MongoShell - 简介 MongoShell是一个互动的JavaScript接口的MongoDB,可以使用Mongo ...

  3. poj 3061 题解(尺取法|二分

    题意 $ T $ 组数据,每组数据给一个长度 $ N $ 的序列,要求一段连续的子序列的和大于 $ S $,问子序列最小长度为多少. 输入样例 2 10 15 5 1 3 5 10 7 4 9 2 8 ...

  4. php创建生成数组的相关函数

    php中和数组创建生成的函数有很多,用于定义数组的函数array(),数组合并函数array_combine(),还有array_fill(),array_fill_keys(),range()等等. ...

  5. Red Hat操作系统的安装

    1.双击打开VMware虚拟机 2.以下是打开后的界面,点击“创建新的虚拟机” 3.出现新建虚拟机的导向,选择“自定义” 3.选择虚拟机硬件兼容性,使用默认Workstation 12.0就可以 4. ...

  6. dotnet Core学习之旅(序)

    .NET Core 新玩具,新工具,新生产力 我将在博客园我从0.1开始探索.NET Core 的过程. 为什么是从0.1开始而不是从0开始 我在微软刚宣布开源的时候便接触到了.NET Core 1. ...

  7. hdu 5432

    Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he ...

  8. k8s 开源web操作平台

    https://kuboard.cn/install/install-dashboard.html kuborad

  9. javscript函数的运用

    函数,一段能够自动完成某些功能的代码块,函数的出现,既解决了重复使用重一功能的需求,又可以避免代码的臃肿性. 使用函数有两个要求:必须调用后才可以执行;函数名不要和关键字以及系统函数相同; 函数主要有 ...

  10. CSS ,flex: 1的用处

    flex: 1:的妙用 首先  flex 是 flex-grow.flex-shrink.flex-basis的缩写. 当 flex 取值为一个非负数字,则该数字为 flex-grow 值,flex- ...