大佬们可以帮我看一下c题吗?

#include <iostream>
#include <vector>

using namespace std;

long long cab(int a, int b){
    long long ans = 1;
    for(int i = 0; i < b; i++){
        ans *= a-i;
        ans /= i+1;
    }
    return ans;
}
int main(){
    int N, a, b;
    cin >> N >> a >> b;
    N = (N-1)*N/2;
    int mod = 1e9+7;
    long long total = (cab(N, a) * cab(N, b)) % mod;
    if(a + b <= N){
        long long wu = (cab(N, a) * cab(N-a, b)) % mod;
        total = (total-wu+mod) % mod;
    }
    cout <<total;
    return 0;
}
思路就是先找一共有多少种情况,然后减去一条公共边都没有的,就是至少有一条公共边的数量。但是这样答案不对,大佬们可以帮我看一下吗,是思路问题还是代码问题?
全部评论
如果是思路问题,那肯定代码也有问题,如果思路没有问题,那就一定是代码写的有问题
1 回复 分享
发布于 2021-11-27 14:59
公式没问题,组合数计算的问题,1000的阶乘肯定整数溢出,同余也不能直接做除法,因而这个地方需要求逆元,具体做法看其他人代码就好了
1 回复 分享
发布于 2021-11-27 15:56

相关推荐

球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
头像
昨天 11:39
四川大学 Java
是红鸢啊:忘了还没结束,还有字节的5k 违约金
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务