若直线的斜率为0或者不存在斜率,则有$nC(m,3)+mC(n,3)$种方案。若直线的斜率不为0,只需考虑斜率为正的情况,最后答案再乘以2即可。枚举两个点的坐标差,设$t=\min(n,m)$,则有:

\[\begin{eqnarray*}
ans&=&\sum_{i=1}^n\sum_{j=1}^m(n-i)(m-j)(\gcd(i,j)-1)\\
&=&\sum_{d=1}^t\sum_{i=1}^n\sum_{j=1}^m[\gcd(i,j)=d](n-i)(m-j)(\gcd(i,j)-1)\\
&=&\sum_{d=1}^t\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}[\gcd(i,j)=1](n-di)(m-dj)(d-1)\\
&=&\sum_{d=1}^t(d-1)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}(n-di)(m-dj)\sum_{k|\gcd(i,j)}\mu(k)\\
&=&\sum_{d=1}^t(d-1)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor}(n-di)(m-dj)\sum_{k|i,k|j}\mu(k)\\
&=&\sum_{d=1}^t(d-1)\sum_{k}\mu(k)\sum_{k|i}\sum_{k|j}(n-di)(m-dj)\\
&=&\sum_{d=1}^t(d-1)\sum_{k}\mu(k)\sum_{k|i}(n-di)\sum_{k|j}(m-dj)\\
&=&\sum_{d=1}^t(d-1)\sum_{k}\mu(k)cal(n,d,k)cal(m,d,k)
\end{eqnarray*}\]

  其中:

\[\begin{eqnarray*}
cal(n,d,k)&=&\sum_{k|i}(n-di)\\
&=&n\sum_{k|i}1-d\sum_{k|i}i\\
&=&n\lfloor\frac{n}{dk}\rfloor-\frac{dk(1+\lfloor\frac{n}{dk}\rfloor)\lfloor\frac{n}{dk}\rfloor}{2}
\end{eqnarray*}\]

  设$D=dk$,则有:

\[\begin{eqnarray*}
F(n,D)=cal(n,d,k)&=&n\lfloor\frac{n}{dk}\rfloor-\frac{dk(1+\lfloor\frac{n}{dk}\rfloor)\lfloor\frac{n}{dk}\rfloor}{2}\\
&=&n\lfloor\frac{n}{D}\rfloor-\frac{D(1+\lfloor\frac{n}{D}\rfloor)\lfloor\frac{n}{D}\rfloor}{2}\\
ans&=&\sum_{d=1}^t(d-1)\sum_{k}\mu(k)cal(n,d,k)cal(m,d,k)\\
&=&\sum_{k=1}^t\mu(k)\sum_{d}(d-1)cal(n,d,k)cal(m,d,k)\\
&=&\sum_{k=1}^t\mu(k)\sum_{k|D}(\frac{D}{k}-1)F(n,D)F(m,D)\\
&=&\sum_{D=1}^t F(n,D)F(m,D)\sum_{k|D}\mu(k)(\frac{D}{k}-1)\\
&=&\sum_{D=1}^t F(n,D)F(m,D)(\sum_{k|D}\mu(k)\frac{D}{k}-\sum_{k|D}\mu(k))\\
&=&\sum_{D=1}^t F(n,D)F(m,D)(\varphi(D)-[D=1])
\end{eqnarray*}\]

  综上所述,只需要一遍线性筛求出所有欧拉函数然后计算即可,时间复杂度$O(n)$。

#include<cstdio>
typedef long long ll;
const int N=50010,P=1000000007;
int n,m,t,i,j,ans,phi[N],v[N],p[N],tot;
inline ll cal(ll n,ll d){return n/d*n-d*(n/d)*(n/d+1)/2;}
ll C(ll n){return n*(n-1)*(n-2)/6;}
int main(){
scanf("%d%d",&n,&m);t=n<m?n:m;
for(phi[1]=1,i=2;i<=t;i++){
if(!v[i])p[++tot]=i,phi[i]=i-1;
for(j=1;j<=tot;j++){
if(i*p[j]>t)break;
v[i*p[j]]=1;
if(i%p[j]==0){phi[i*p[j]]=phi[i]*p[j];break;}else phi[i*p[j]]=phi[i]*(p[j]-1);
}
}
for(i=1;i<=t;i++)ans=(ans+cal(n,i)%P*cal(m,i)%P*(phi[i]-(i==1))%P)%P;
return printf("%d",(ans*2%P+C(m)%P*n%P+C(n)%P*m%P)%P),0;
}

  

BZOJ3518 : 点组计数的更多相关文章

  1. 【BZOJ3518】点组计数 欧拉函数

    [BZOJ3518]点组计数 Description 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c ...

  2. 【BZOJ3518】点组计数

    Description 平面上摆放着一个\(n*m\)的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c是不同的3个点,其顺序 ...

  3. 【bzoj3518】点组计数 欧拉函数(欧拉反演)

    题目描述 平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵).Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线.这里a,b,c是不同的3个点,其顺序无关紧要.(即(a,b ...

  4. BZOJ 3518 点组计数 ——莫比乌斯反演

    要求$ans=\sum_{i=1}^n \sum_{j=1}^m (n-i)(m-j)(gcd(i,j)-1)$ 可以看做枚举矩阵的大小,然后左下右上必须取的方案数. 这是斜率单增的情况 然后大力反演 ...

  5. 欧拉函数(汇总&例题)

    定义 欧拉函数 $\varphi(n)$表示小于等于$n$的正整数中与$n$互质的数的数目. 性质 1.积性函数(证明). 2.$\varphi(1)=1$(显然) 3.对于质数$n$,$\varph ...

  6. .NET正则基础之——平衡组

    1        概述 平衡组是微软在.NET中提出的一个概念,主要是结合几种正则语法规则,提供对配对出现的嵌套结构的匹配..NET是目前对正则支持最完备.功能最强大的语言平台之一,而平衡组正是其强大 ...

  7. .NET正则平衡组

    1        概述 平衡组是微软在.NET中提出的一个概念,主要是结合几种正则语法规则,提供对配对出现的嵌套结构的匹配..NET是目前对正则支持最完备.功能最强大的语言平台之一,而平衡组正是其强大 ...

  8. 机器学习常用Python扩展包

    在Ubuntu下安装Python模块通常有3种方法:1)使用apt-get:2)使用pip命令(推荐);3)easy_instal 可安装方法参考:[转]linux和windows下安装python集 ...

  9. RTCP资料详解

    转自:http://www.360doc.com/content/13/0606/10/1317564_290865866.shtml RTCP RTCP协议将控制包周期发送给所有连接者,应用与数据包 ...

随机推荐

  1. ffmpeg查看音频文件信息

    查看音频文件的信息(基于本地路径) import subprocess import json path = r'D:\learn\download\NosVJ60QCIs0b8PVHMPomZJsr ...

  2. bellman-ford算法(判断有没有负环)

    #include <iostream> #include <vector> #include<string> #include<cstring> usi ...

  3. python 入门基础23 选课系统 项目

    选课系统 代码地址:github_code # 选课系统 # 角色:学校.学员.课程.讲师 # 要求: # 1. 创建北京.上海 2 所学校 # 2. 创建linux , python , go 3个 ...

  4. Dream_Spark版本定制第一课

    从今天起,我们踏上了新的Spark学习旅途.我们的目标是要像Spark官方机构那样有能力去定制Spark. 一.  我们最开始将从Spark Streaming入手. 为何从Spark Streami ...

  5. python中的*号

    from:https://www.douban.com/note/231603832/ 传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊 ...

  6. 初步认识mitmproxy(一)

    在windows机器上,经常用的最多的是fiddler工具,很强大,图形化界面,使用方便.简单:在mac上,Charles 类似fiddler工具,同样是易于操作的图形化界面,同样都是通过代理的方式实 ...

  7. 八、vue使用element-ui组件

    element-ui组件 1.引入element import Vue from 'vue'; import ElementUI from 'element-ui'; import 'element- ...

  8. Promise初探

    在JavaScript的世界中,所有代码都是单线程执行的. 由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行.异步执行可以用回调函数实现: function ru ...

  9. sonarLint--强大的代码审查工具(插件)

    idea也有的一个插件 贴上一个eclipse的sonarlint用法 http://blog.csdn.net/limm33/article/details/51166840 不过听说从2015年1 ...

  10. Django为数据库的ORM写测试例(TestCase)

    models.py里的数据库定义如下: from django.db import models # Create your models here. class Teachers(models.Mo ...