Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 664 Solved: 403
[Submit][Status][Discuss]
Description
给定一个nxm的网格,请计算三点都在格点上的三角形共有多少个。下图为4x4的网格上的一个三角形。
注意三角形的三点不能共线。
Input
输入一行,包含两个空格分隔的正整数m和n。
Output
输出一个正整数,为所求三角形数量。
Sample Input
2 2
Sample Output
76
数据范围
1<=m,n<=1000
乱搞题。。
斜着的怎么算呢?
算出“\”的,“/”用“\”乘2即可。
我们枚举
(把斜线当做直角三角形的斜边就明白为什么是
而这条斜线还可以平移,一共有
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std;
LL n,m;
LL C(LL x)
{
LL ans;
if (x<3) return 0LL;
ans=x*(x-1)*(x-2)/6LL;
return ans;
}
int main()
{
scanf("%lld%lld",&n,&m);
LL ans=1;
LL tot=(n+1)*(m+1);
ans=C(tot);
LL d=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
LL k=__gcd(i,j)+1;
if (k<3) continue;
d+=(k-2)*2*(n+1-i)*(m+1-j);
}
d+=(C(m+1)*(n+1)+C(n+1)*(m+1));
cout<<ans-d<<endl;
return 0;
}
感悟:
想斜线的计算方法想了好久,但总是有漏掉的。。这种做法值得借鉴。。
原文地址:http://blog.csdn.net/regina8023/article/details/44974953