思路:这是一个求网格三角形的问题。
对于n*m的矩阵只要求得所有的“三角形”再将其中的在同一条直线上的“三角形”剪掉。就可以求出答案。
求总数:C((n+1)*(m+1),3);
在同一横线上的:C(m+1,3)*(n+1)
在同一竖线上的:C(n+1,3)*(m+1)
在同一斜线上的:for(int i=2;i<=n;i++)
for(int j=2;j<=m;j++)
sum3+=(long long)(gcd(i,j)-1)*(n-i+1)*(m-j+1)*2;
代码:
#include<iostream>
#include<cstdio>#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std;
int gcd(int a,int b) {
if(b==0) {
return a;
}
return gcd(b,a%b);
}
long long com(int n,int r) {
if(n<r)return 0;
if(n-r<r)r=n-r;
int i,j;
long long ret=1;
for(i=0,j=1; i<r; i++) {
ret*=(n-i);
for(; j<=r&&ret%j==0; j++) {
ret/=j;
}
}
return ret;
}
int main() {
int n,m;
int t=1;
while(cin>>n>>m) {
if(n==0&&m==0) {
break;
}
long long sum=0;
sum=com((n+1)*(m+1),3);
sum-=com(n+1,3)*(m+1);
sum-=com(m+1,3)*(n+1);
for(int i=2; i<=n; i++) {
for(int j=2; j<=m; j++) {
sum-=(long long)(gcd(i,j)-1)*(n-i+1)*(m-j+1)*2;
}
}
printf("Case %d: %lld\n",t++,sum);
}
return 0;
}