莫比乌斯
先上一个博客
吊打神犇的题解
其实和莫比乌斯一点关系也没有
正常的莫比乌斯是没有后面的
m
i
n
(
n
/
i
,
m
/
j
)
min(n/i,m/j)
min(n/i,m/j)这个系数的,所以就不会了。。。。。
因为怎么消元都还至少要枚举两个数,即一定会炸
——————————————————————————————————————————————
遇到这种情况,
APIO的选手告诉我们好方法:打表
——————————————————————————————————————————————
打表
我们打出个暴力,然后让程序输出每个情况,作出一张表
然后我们惊奇地发现一个规律,
a
n
s
=
n
∗
m
\color{purple}ans=n*m%p
ans=n∗m
!
!
!
!
\color{orange}!!!!
!!!!
要严谨的数学证明?不可能的,网上就没有一篇写数学证明的
我们理解一下原式的几何意义
当
g
c
d
(
i
,
j
)
不
等
于
1
的
时
候
gcd(i,j)不等于1的时候
gcd(i,j)不等于1的时候则必有
g
c
d
(
i
/
g
c
d
(
i
,
j
)
,
j
/
g
c
d
(
i
,
j
)
)
)
=
1
gcd(i/gcd(i,j),j/gcd(i,j)))=1
gcd(i/gcd(i,j),j/gcd(i,j)))=1即以前被算过
下证:
而
m
i
n
(
n
/
i
,
m
/
j
)
min(n/i,m/j)
min(n/i,m/j) 表示矩阵[n,m]里有多少个以
(
i
,
j
)
为
斜
率
的
直
线
上
的
整
点
(i,j)为斜率的直线上的整点
(i,j)为斜率的直线上的整点
n
/
i
,
m
/
j
n/i,m/j
n/i,m/j 分别表示n,m中含有多少个i,j所以它们间的最小值即为(i,j)的整数倍
即矩阵中所有以(i,j)为斜率的点
在直角坐标系上表示出来,我们发现每个
g
c
d
(
i
,
j
)
=
=
1
gcd(i,j)==1
gcd(i,j)==1点的斜率都会被计算一次,这个斜率上的所有的都会被计算一次,所以矩阵上所有的点都会被计算一次
结论
a
n
s
=
n
∗
m
\color{purple} ans=n*m%p
ans=n∗m
——————————————————————————————————————————————
接下来没什么好说的,上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,p;
ll ans=0;
int main(){
scanf("%d%d%d",&n,&m,&p);
ans=1ll*n%p*(m%p)%p;
printf("%lld\n",ans);
}
这道题也给我们一个启示,遇到数论题,不会做的时候,还是打表好