a + b + c <= n的解的数量

时间:2012-06-22 03:51:09

标签: c++ algorithm math

每个人,这是参考这个问题: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;
 }

1 个答案:

答案 0 :(得分:1)

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

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

其余部分代码不清楚,但是正确无误。我会做类似的事情:

int A = maxA - minA;

而不是

maxA -= minA;
int A = maxA;

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

哦,并修改你的最终答案,我认为是问题所在。