UVA3295
題意:給出一個a*b的網格,在網格上取不共線的三點構成三角形,求三角形總數。
分析:就是一一道簡單的組合數計算題目,設總結點數為n,則取三個節點的個數為C(n,3),然后減去橫向、豎向、斜向的三點共線的個數即可,斜線三點共線等價于所枚舉的矩形的長寬成倍數關系,即gcd不為1
代碼如下:
#include <stdio.h> #include <iostream> using namespace std; long long gcd(long long a, long long b){if(a%b==0) return b;return gcd(b, a%b); } int main(){long long a, b;int cas = 1;while(scanf("%lld%lld", &a, &b)!=EOF && (a||b)){long long n = (a+1)*(b+1);long long sum1 = n*(n-1)*(n-2)/6; //C(n,3)long long sum2 = (b+1)*(a+1)*a*(a-1)/6 + (a+1)*(b+1)*b*(b-1)/6; //橫向或豎向三點共線的個數long long sum3 = 0; //斜線上三點共線的個數的一半int i, j;for(i=2; i<=a; i++)for(j=2; j<=b; j++)sum3 += (gcd(i,j)-1) * (a-i+1) * (b-j+1);a++;b++;long long ans = sum1 - 2*sum3 - sum2;printf("Case %d: %lld\n", cas++, ans);}return 0; }總結
- 上一篇: Oracle 10g RAC Insta
- 下一篇: .net2.0 C# Json反序列化