三角形的 22 条边上分别有 mm 和 nn 个点(不包括三角形的顶点),这些点分别同这两条边相对的顶点有连线,这样组成了一个复杂的图形,问这个图形中包含了多少个不同的三角形。由于数量很大,输出结果 mod 1000000007mod 1000000007。

输入
第1行:2个数,m,n 中间用空格分隔。(1<= m,n <= 1e9)
输出
输出对应的三角形的数量。
输入样例
2 1
输出样例
15
考虑以 AA 为顶点的三角形数量, 线段 [A1,B][A1,B] 上任取 22 点,同 AA 可以组成三角形,因此总数量为 C(n+2,2)C(n+2,2) 。
与 [A1,B][A1,B] 类似的线段,共有 m+1m+1 条。总数为:
(n+1)∗n/2∗(m+1)(n+1)∗n/2∗(m+1)
考虑以 BB 为顶点的三角形数量, 线段 [B1,A][B1,A] 上任取 22 点,同 BB 可以组成三角形,因此总数量为 C(m+2,2)C(m+2,2) 。
与 [B1,A][B1,A] 类似的线段,共有 n+1n+1 条。总数为:
(m+1)∗m/2∗(n+1)(m+1)∗m/2∗(n+1)
这两种统计方法,有重复统计,即同时以 A,BA,B 为顶点的三角形。
这种三角形的数量为 (m+1)(n+1)(m+1)(n+1) 个。减掉这部分即可。
参考题解
#include <bits/stdc++.h>
using namespace std;
const long long Mod = 1000000007;
int main() {
long long m, n;
cin >> m >> n;
long long ans1 = (m + 1) * ((n + 1) * (n + 2) / 2 % Mod);
long long ans2 = (n + 1) * ((m + 1) * (m + 2) / 2 % Mod);
long long ans3 = (m + 1) * (n + 1) % Mod;
cout << (ans1 + ans2 - ans3) % Mod << endl;
return 0;
}
该博客讨论了如何计算一个由三角形的各边上额外点连接形成的复杂图形中的不同三角形数量。通过数学公式计算了以三角形各顶点为基点的不同三角形数目,并减去重复统计的部分,最后给出了C++代码实现来求解模1000000007的最终结果。
1451

被折叠的 条评论
为什么被折叠?



