题目描述

  • 给出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. Java中关于时间日期格式保存到mysql的问题

    首先在设置数据库的时间日期字段的时候要先确定好采用何种类型,DATETIME. TIMESTAMP.DATE.TIME.YEAR. 其中datetime.time用的比较多,对应java中生成的poj ...

  2. EFCore 通过实体Model生成创建SQL Server数据库表脚本

    在我们的项目中经常采用Model First这种方式先来设计数据库Model,然后通过Migration来生成数据库表结构,有些时候我们需要动态通过实体Model来创建数据库的表结构,特别是在创建像临 ...

  3. Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退

    在 Android 7.0 之前 Google 提供的动态申请权限的 API,可以调用相机拍照,访问SDcard等操作都只需要申请对应的权限,如下: <uses-permission andro ...

  4. The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team [单调栈上二分]

    也许更好的阅读体验 \(\mathcal{Description}\) 给n个数,与一个数m,求\(a_i\)右边最后一个至少比\(a_i\)大\(m\)的数与这个数之间有多少个数 \(2\leq n ...

  5. sqlserver exists 与 in 的区别

    使用 EXISTS 方式 select * from A  a where EXISTS(select b.mainInfoId from B b  where b.mainInfoId=a.main ...

  6. 怎样获取当前页面框架的数量(即iframe和frame的数量)

    需要使用window.length, 或者window.frames.length; 如果页面中不包含frame和iframe元素, 则返回0; window.length === window.fr ...

  7. hdu 1501 贪心问题

    这道题目的关键就是逐个搜索的过程 找个时间得复习一下dfs了    这里使用temp作为参照变量 每次比较以后(由于已经排序好) 已temp为参照进行下一次的比较

  8. 基于【 springBoot +springCloud+vue 项目】一 || 项目架构简介

    一.前言 基于前期学习以及工作经验积累,持续更新基于springboot+springcloud+vue的demo项目.

  9. 回忆一下Node(随时更改,想到什么写什么)

    什么是Node? Node.js 是一个基于Chrome V8 引擎的JavaScript运行环境 Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效 事件驱动: 任务执行,发布者 ...

  10. K2 BPM_规范内部供应链流程,提高企业整体绩效_工作流流程管理

    方案背景 随着企业竞争的加剧.顾客需求的多样化以及市场变化的不确定因素增多,企业与企业间的竞争已经逐步转变为供应链与供应链间的竞争.企业只有在内部各业务流程有机统一的状态下,再与外部企业进行融合与协作 ...