枚举所有类型的对角线,计算出每种对角线的总个数,注意不要重复计算。包围盒这个思想很不错。先算总的,再减去重复的。因为总的也好算,重复的也好算。
#include<bits/stdc++.h>
#define maxn 310
using namespace std;
int n,m;
int GCD[maxn][maxn];
int gcd(int a,int b)
{
return a%b==0?b:gcd(b,a%b);
}
int main()
{
for(int i=1;i<=300;i++)
for(int j=1;j<=i;j++)
GCD[i][j]=GCD[j][i]=gcd(i,j);
while(scanf("%d %d",&n,&m)==2&&(n+m))
{
int sum=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(GCD[i][j]>1) continue;
int c=0;
if(n-1-2*i>=0&&m-1-2*j>=0) c=(n-2*i)*(m-2*j);
sum+=(n-i)*(m-j)-c;
}
printf("%d\n",sum<<1);
}
return 0;
}