题目描述
给定一个 N×MN\times MN×M 的网格,请计算三点都在格点上的三角形共有多少个。注意三角形的三点不能共线。
输入格式
输入一行,包含两个空格分隔的正整数 MMM 和 NNN 。
输出格式
输出一个正整数,为所求三角形数量。
输入输出样例
输入 #1
2 2
输出 #1
76
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤N,M≤10001\le N,M\le10001≤N,M≤1000。
const int N=1e6+5;
//int n, m, _;
int i, j, k;
//int a[N];
ll a, b;
ll C(ll n, ll m)
{
if(m > n) return 0;
if(m == n) return 1;
if(m > n - m) m = n - m;
ll num = 1, cen = 1;
for(int i = 1; i <= m; i++){
num = num * (n - i + 1);
cen = cen * i;
}
return num / cen;
}
signed main()
{
//IOS;
while(~sll2(a, b)){
if(a == 1 || b == 1){
pll(0);
continue;
}
ll ans = (a + 1) * (b + 1);
ans = C(ans, 3);
ans -= C(a + 1, 3) * (b + 1);
//dbg(ans);
ans -= C(b + 1, 3) * (a + 1);
//dbg(ans);
for(int i = 1; i <= a; i++){
for(int j = 1; j <= b; j++){
ll res = (a - i + 1) * (b - j + 1) * (__gcd(i, j) - 1);
ans -= res * 2;
}
}
pll(ans);
}
//PAUSE;
return 0;
}