题目描述

平面上摆放着一个n*m的点阵(下图所示是一个3*4的点阵)。Curimit想知道有多少三点组(a,b,c)满足以a,b,c三点共线。这里a,b,c是不同的3个点,其顺序无关紧要。(即(a,b,c)和
(b,c,a)被认为是相同的)。由于答案很大,故你只需要输出答案对1,000,000,007的余数就可以了。

输入

有且仅有一行,两个用空格隔开的整数n和m。

输出

有且仅有一行,一个整数,表示三点组的数目对1,000,000,007的余数。(1,000。000。007是质数)

样例输入

3 4

样例输出

2 0


题解

欧拉函数(欧拉反演)

先单独考虑横着的和竖着的,答案分别为 $m·C_n^3$ 和 $n·C_m^3$ 。

然后考虑斜着的:设第一个点和第三个点横坐标差为 $i$ ,纵坐标差为 $j$ ,那么它们中间就有 $\gcd(i,j)-1$ 个点,所以第二个点的个数就是 $\gcd(i,j)-1$ ;又因为这样的矩形有 $(n-i)(m-j)$ 个,每个矩形有2个,因此总个数就是 $2(n-i)(m-j)\gcd(i,j)$ 。

因此斜着的答案就是:

$\sum\limits_{i=1}^{n-1}\sum\limits_{j=1}^{m-1}2(n-i)(m-j)\gcd(i,j)=2\sum\limits_{d=1}^{min(n-1,m-1)}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac {n-1}d\rfloor}(n-di)\sum\limits_{j=1}^{\lfloor\frac {m-1}d\rfloor}(m-dj)$

快筛 $\varphi$ ,枚举 $d$ ,后面的两个 $\sum$ 用等差数列求和公式 $O(1)$ 求出。

时间复杂度 $O(n)$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 50010
#define mod 1000000007
using namespace std;
typedef long long ll;
int phi[N] , prime[N] , tot , np[N];
int main()
{
int n , m , i , j;
ll ans;
scanf("%d%d" , &n , &m) , ans = ((ll)n * (n - 1) * (n - 2) / 6 % mod * m + (ll)m * (m - 1) * (m - 2) / 6 % mod * n) % mod;
if(n > m) swap(n , m);
n -- , m -- ;
phi[1] = 1;
for(i = 2 ; i <= n ; i ++ )
{
if(!np[i]) phi[i] = i - 1 , prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= n ; j ++ )
{
np[i * prime[j]] = 1;
if(!(i % prime[j]))
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * phi[prime[j]];
}
}
for(i = 1 ; i <= n ; i ++ )
ans = (ans + (ll)(n - i + 1 + n - n / i * i + 1) * (n / i) / 2 % mod * (m - i + 1 + m - m / i * i + 1) % mod * (m / i) % mod * phi[i]) % mod;
printf("%lld\n" , (ans - (ll)n * (n + 1) / 2 % mod * m % mod * (m + 1) % mod + mod) % mod);
return 0;
}

【bzoj3518】点组计数 欧拉函数(欧拉反演)的更多相关文章

  1. GCD nyoj 1007 (欧拉函数+欧几里得)

    GCD  nyoj 1007 (欧拉函数+欧几里得) GCD 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 The greatest common divisor ...

  2. 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛

    题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...

  3. 【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论

    http://poj.org/problem?id=2478 题意:给定一个数x,求<=x的数的欧拉函数值的和.(x<=10^6) 题解:数据范围比较大,像poj1248一样的做法是不可行 ...

  4. BZOJ3518 : 点组计数

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

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

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

  6. hdoj 1286 找新朋友【欧拉函数】

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. ACM学习历程—HYSBZ 2818 Gcd(欧拉函数 || 莫比乌斯反演)

    Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...

  8. BZOJ2190 & 欧拉函数

    题意: 求1-n内互质数对个数 SOL: 裸欧拉函数,还有莫比乌斯反演的加速什么的,挖个坑. Code: /*============================================= ...

  9. UVA11426 GCD - Extreme (II) (欧拉函数/莫比乌斯反演)

    UVA11426 GCD - Extreme (II) 题目描述 PDF 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 10 100 200000 0 输出样例#1: 67 13 ...

  10. HDU 3501【欧拉函数拓展】

    欧拉函数 欧拉函数是指:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . 通式:φ(x)=x*(1-1/p1)(1-1/p2)(1-1/p3)*(1-1/p4)-..(1- ...

随机推荐

  1. 课上实践练习——MySort

    模拟实现Linux下Sort -t : -k 2的功能.参考 Sort的实现.提交码云链接和代码运行截图. Linux下Sort -t : -k 2的功能 sort的工作原理: sort将文件的每一行 ...

  2. P2P平台投宝金融跑路?为什么我没有中雷!

    编者按:市场有风险,投资需谨慎.最近,安徽合肥P2P平台"投保金融"跑路倒闭了. 今天(2016年11月8日)下午,在朋友圈看到一个分享,投宝金融跑路了,新闻媒体已经传开了. 这个 ...

  3. Docker入门篇(二)之docker的单主机网络

    Docker 安装时会自动在host上创建三个网络,我们可用 docker network ls命令查看: [root@localhost ~]# docker network ls NETWORK ...

  4. 每周开源项目分享-年轻人的第一个OAuth2.0 Server:hydra

    年轻人的第一个OAuth2.0 Server:hydra hydra 是什么呢? OpenID Connect certified OAuth2 Server - cloud native, secu ...

  5. hive 动态分区插入

    首先需要进行以下设置: set hive.exec.dynamic.partition=true; set hive.exec.dynamic.partition.mode=nonstrict; se ...

  6. 使用IntelRealScene设备结合Cocos引擎实现体感游戏开发

    英特尔开发人员专区原文地址 Cocos游戏开发引擎对于广大开发者来说都比较熟悉,Intel RealScene是什么呢,简单理解是一种特殊的摄像头,可以捕捉用户的手势,面部表情等,进而实现AR,VR的 ...

  7. MATLAB 笔记

    MATLAB的学习 Matlab 主要有5大部分构成,分别是MATLAB语言,桌面工具与开发环境,数学函数库 ,图形系统和应用程序接口.以及众多的专业工具.

  8. 算法笔记(c++)--使用一个辅助栈排列另一个栈

    算法笔记(c++)--使用一个辅助栈排列另一个栈 仅仅使用一个辅助栈,不使用其他数据结构来排列一个栈,要求,上大下小. 分析下.肯定是先吧主栈中的数据都放到辅助栈中,在辅助栈中上小下大. 1.首先循环 ...

  9. Qt 编程指南

    Qt 编程指南 持续关注一本正在编写的Qt编程指南,期待作者早日完成创作.

  10. spark总结——转载

    转载自:    spark总结 第一个Spark程序 /** * 功能:用spark实现的单词计数程序 * 环境:spark 1.6.1, scala 2.10.4 */ // 导入相关类库impor ...