列表

详情


NC19934. [CQOI2014]数三角形

描述

给定一个n x m的网格,请计算三点都在格点上的三角形共有多少个。
下图为4x4的网格上的一个三角形。

 注意三角形的三点不能共线。

输入描述

输入一行,包含两个空格分隔的正整数m和n。

输出描述

输出一个正整数,为所求三角形数量。

示例1

输入:

2 2

输出:

76

说明:

数据范围
1<=m,n<=1000

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 55ms, 内存消耗: 404K, 提交时间: 2022-02-14 16:53:42

#include<bits/stdc++.h>
using namespace std;
#define ll long long 


ll n,m;

int main(){
	cin>>n>>m;
	n++,m++;
	ll ans=(n*m)*(n*m-1)*(n*m-2)/6;
	if(n>=3)ans-=n*(n-1)*(n-2)*m/6;
	if(m>=3)ans-=m*(m-1)*(m-2)*n/6;
	for(int i=2;i<=n;i++){
		for(int j=2;j<=m;j++){
			ans-=2*(__gcd(i,j)-1)*(n-i)*(m-j);
		}
	}
	printf("%lld\n",ans);
	return 0;
}

Python3 解法, 执行用时: 921ms, 内存消耗: 4632K, 提交时间: 2023-04-07 21:21:51

import math
n,m = input().split()
n = int(n)
m = int(m)
h = (m+1)*(n+1)
x1 = h*(h-1)*(h-2)//6
if(n>=2):
    x1 -= (m+1)*(n+1)*n*(n-1)//6
if(m>=2):
    x1 -= (n+1)*(m+1)*m*(m-1)//6
    
for i in range(1,n+1):
    for j in range(1,m+1):
        x1 -= (n-i+1)*(m-j+1)*(math.gcd(i,j)-1)*2
print(x1)

上一题