Description
给定一个n x m的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
Input
输入一行,包含两个空格分隔的正整数m和n。
Output
输出一个正整数,为所求三角形数量。
Sample Input
Input I:1 1Input II:2 2
Sample Output
Output I:4Output II:76
HINT
对于30%数据
1≤m, n≤10
对于100%数据
1≤m, n≤1000
#include<stdio.h>
int
gcd[1010][1010],n,m;
long
long
t,ans;
int
getgcd(
int
a,
int
b)
{
if
(gcd[a][b])
return
gcd[a][b];
if
(!a)
return
gcd[a][b]=b;
if
(!b)
return
gcd[a][b]=a;
return
gcd[a][b]=getgcd(b,a%b);
}
int
main()
{
scanf
(
"%d%d"
,&n,&m);
for
(
int
i=1;i<=m;i++)
gcd[0][i]=i;
for
(
int
i=1;i<=n;i++)
gcd[i][0]=i;
for
(
int
i=1;i<=n;i++)
for
(
int
j=1;j<=m;j++)
getgcd(i,j);
t=(n+1)*(m+1);
ans=t*(t-1)*(t-2)/6;
for
(
int
i=0;i<=n;i++)
for
(
int
j=0;j<=m;j++)
if
(i||j)
{
if
(!i||!j)
ans-=(
long
long
)(gcd[i][j]-1)*(n-i+1)*(m-j+1);
else
ans-=(
long
long
)2*(gcd[i][j]-1)*(n-i+1)*(m-j+1);
}
printf
(
"%lld"
,ans);
}
AC 顶一个