若直线的斜率为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. js截取图片上传(仅原理)----闲的无聊了代码就不共享了!写的难看,不好意思给你们看了(囧)

    就算世界再坑爹,总有一些属性能带你走出绝望(伟大的absolute) 今天吐槽一下!......在我的世界里没有正统UI,所以效果图永远都是那么坑爹! 这里我要感谢有个position:absolut ...

  2. HTML5自定义data属性

    可能大家在使用jquery mobile时,经常会看到data-role.data-theme等的使用,比如:通过如下代码即可实现页眉的效果: [html] <div data-role=&qu ...

  3. iOS代码规范之命名规范

    技术博客http://www.cnblogs.com/ChenYilong/    新浪微博http://weibo.com/luohanchenyilong   命名规范类命名    首字母大写,之 ...

  4. Javascript - 预编译与函数词法作用域

    预编译与函数词法作用域(Precompiled & Scoped) 预编译 Javascript脚本的宿主在执行代码之前对脚本做了预编译处理,比如浏览器对Js进行了预编译,编译器会扫描所有的声 ...

  5. 【SVN】SVN的trunk、branches、tag的使用以及分支的概念

    SVN命令参考:   https://www.cnblogs.com/wlsxmhz/p/5775393.html svn的存储结构一般建议在根目录下建立trunk.branches.tags这三个文 ...

  6. Python人工智能之图片识别,Python3一行代码实现图片文字识别

    1.Python人工智能之图片识别,Python3一行代码实现图片文字识别 2.tesseract-ocr安装包和中文语言包 注意:

  7. linux网桥浅析

    linux网桥浅析 原文链接:http://hi.baidu.com/_kouu/item/25787d38efec56637c034bd0 什么是桥接?简单来说,桥接就是把一台机器上的若干个网络接口 ...

  8. ps自由变换以及再次变换快捷键

    ctrl+t:自由变换ctrl+shift+t:再次变换ctrl+shift+alt+t:复制一次,再次变换.

  9. google closure 笔记-SOY template

    一 使用js模板 closure template 目前支持Java和js.但是模板语法的设计不依赖于任何现成的语言,所以理论上可以支持任何语言,只是暂时只有java编译器. 使用js模板:编写模板文 ...

  10. 排序算法的JS实现

    排序算法是基础算法,虽然关键在于算法的思想而不是语言,但还是决定借助算法可视化工具结合自己常用的语言实现一下 1.冒泡排序 基本思路:依次比较两两相邻的两个数,前面数比后面数小,不变.前面数比后面数大 ...