首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >a+b+c<=n的解决方案数量

a+b+c<=n的解决方案数量
EN

Stack Overflow用户
提问于 2012-06-22 11:51:09
回答 1查看 850关注 0票数 1

各位,这是关于这个问题的:http://www.spoj.pl/problems/DCEPC702/。(请看这里的示例输入)。我将问题陈述转化为,找到这个形式的方程的解的个数,na + nb + nc <= newNnewN = N - (mina + minb + minc)

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

然后,我尝试了包含-排除,以找到解决方案的数量。我对这个原则还不熟悉,因此我不确定我这样做是否正确。不管怎样,我的答案是不正确的。有人能告诉我在这种方法中我哪里错了吗?这是我的代码。

提前谢谢。

代码语言:javascript
复制
#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;
 }
EN

回答 1

Stack Overflow用户

发布于 2012-06-22 13:17:17

您可能应该通过一些简单的案例来看看哪里出了问题。

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

你剩下的一些代码不清楚,但是正确的。我会这样做:

代码语言:javascript
复制
int A = maxA - minA;

而不是

代码语言:javascript
复制
maxA -= minA;
int A = maxA;

此外,还有潜在的溢出错误,这取决于数字的大小-将所有三个数字相乘,然后除以6,在您到达mod之前可能会溢出。你应该能够做的是找出这三个中的哪一个可以被3整除,然后计算出哪一个/哪一个可以被2整除,然后再除以一个因子。将两个结果相乘,对其进行mod,然后将最终结果相乘,对其进行mod。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11149939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档