a+b+c<=n 的解数

Number of solutions to a+b+c<=n

本文关键字:lt a+b+c      更新时间:2023-10-16

大家,这是关于这个问题的:http://www.spoj.pl/problems/DCEPC702/。请参阅那里的示例输入)。 我将问题陈述转换为此查找这种形式的方程的解数na + nb + nc <= newN newN = N - (mina + minb + minc)

0<=na<=maxa - mina, 0<=nb<=maxb-minb, 0<=nc<=maxc-minc .

然后,我尝试了包含排除以找到解决方案的数量。我对这个原则很陌生,因此我不确定我是否做对了。无论如何,我的答案是不正确的。有人可以告诉我这种方法哪里错了?这是我的代码。

提前谢谢。

#include<iostream>
#include<cstdio> 
using namespace std;
#define MOD 1000000007
#define ulli  long long int
ulli f(int a)
{
if(a<0) return 0;
else
{
    ulli n = (ulli)a;
    return ((((n+3)*(n+2)*(n+1))/6))%MOD;
}
}

 int N;
 int minA, maxA;
 int minB, maxB;
 int minC, maxC;
  int main()
 {
   int T;
scanf("%d",&T);
while(T--)
{
    scanf("%d",&N);
    scanf("%d %d",&minA , &maxA);
    scanf("%d %d",&minB , &maxB);
    scanf("%d %d",&minC , &maxC);
    maxA -= minA;
    maxB -= minB;
    maxC -= minC;
    int A = maxA;
    int B = maxB;
    int C = maxC;
    N -= (minA + minB + minC);

    ulli res = f(N) -f(N-A-1)-f(N-B-1)-f(N-C-1)+f(N-A-B-2)+f(N-C-B-2)+f(N-A-C-2)-f(N-A-B-C-3);
    cout<<res%MOD<<endl;
}

return 0;
 }

您可能应该通过一些简单的案例来查看您出错的地方。

一个明显的问题:你的f公式是(N+3)选择3;它应该是(N+2)选择2。 (如果总共有 N 个分隔符,则添加 2 个分隔符,然后选择这两个分隔符的位置。

其余一些代码不清楚,但正确。 我会做这样的事情:

int A = maxA - minA;

而不是

maxA -= minA;
int A = maxA;

此外,存在潜在的溢出错误,具体取决于数字的大小 - 将所有三个数字相乘然后除以 6 可能会在进入 Mod 之前溢出。 你应该能够做的是弄清楚三个中的哪一个可以被 3 整除,然后把它除出来,然后弄清楚哪一个可以被 2 整除,然后除出一个因子。 将两个结果相乘,修改它,然后将最终结果相乘并修改它。

哦,还有你的最终答案,我认为这就是问题所要求的。