我们发现如果直接枚举是不行的
先把所有状况算出来,然后减掉三点共线的情况:
(1)同行或同列
(2)同一条对角线,只需要算gcd,就可以算出来这个斜率下的总数量
1 /************************************************************** 2 Problem: 3505 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:336 ms 7 Memory:804 kb 8 ****************************************************************/ 9 10 #include <cstdio> 11 12 using namespace std; 13 typedef long long ll; 14 int n, m; 15 ll ans; 16 17 int gcd(int a, int b){ 18 return !b ? a : gcd(b, a % b); 19 } 20 21 inline ll calc(int x){ 22 return (ll) x * (x - 1) * (x - 2) / 6; 23 } 24 25 int main(){ 26 scanf("%d%d", &n, &m); 27 ++n, ++m; 28 ans = (ll) calc(n * m) - m * calc(n) - n * calc(m); 29 int i, j, tmp; 30 for (i = 1; i < n; ++i) 31 for (j = 1; j < m; ++j) 32 if ((tmp = gcd(i, j) + 1) > 2) 33 ans -= (tmp - 2) * (n - i) * (m - j) * 2; 34 printf("%lld\n", ans); 35 return 0; 36 } 37