51Nod 3203 三角形的数量

该博客讨论了如何计算一个由三角形的各边上额外点连接形成的复杂图形中的不同三角形数量。通过数学公式计算了以三角形各顶点为基点的不同三角形数目,并减去重复统计的部分,最后给出了C++代码实现来求解模1000000007的最终结果。

三角形的 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值