a+b+c<=n 的解数
Number of solutions to a+b+c<=n
大家,这是关于这个问题的: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 整除,然后除出一个因子。 将两个结果相乘,修改它,然后将最终结果相乘并修改它。
哦,还有你的最终答案,我认为这就是问题所要求的。
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- 如何显式调用运算符<<
- 模板操作员&lt;未打电话
- C / CUDA中的模板方法是3个角括号(&lt;&lt;&lt;)
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 错误:调用"std::vector<:vector<int>>::p ush_back(std::vector<std::__cxx11::basic_string<
- C 建造者Clang STD :: Sill,找不到超载的操作员&lt;
- 为什么STD :: MAP需要操作员&lt;以及我如何写一个
- 为什么“操作员”需要const但不是为“运营商&lt;”
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 左角支架解释为操作员&lt;而不是模板参数
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- 超载操作员&lt;&lt; - 必须是二进制操作员
- 没有匹配的“运营商&lt;&lt;”