我们发现如果直接枚举是不行的

先把所有状况算出来,然后减掉三点共线的情况:

(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 
View Code

 

posted on 2015-03-17 19:59  Xs酱~  阅读(150)  评论(0编辑  收藏  举报