求方程x1+x2+x3=15的整数解的数目
要求0≤x1≤5,0≤x2≤6,0≤x3≤7。
解:令N为全体非负整数解(x1,x2,x3),
A1为其中x1≥6的解;y1=x1-6≥0的解;
A2为其中x2≥7的解;y2=x2-7≥0的解;
A3为其中x3≥8的解。y3=x3-8≥0的解

A1的个数,相当于对(y1+6)+x2+x3=15求非负整数解的个数,
其为C(3+9-1,9)=C(11,2)

A2的个数,相当于对x1+(y2+7)+x3=15求非负整
数解的个数。C(3+8-1,8)=C(10,2)

A3的个数,相当于对x1+x2+(y3+8)=15求非负整
数解的个数。C(3+7-1,7)=C(9,2)

性质A1∩A2的个数,相当于对
(y1+6)+(y2+7)+x3=15求非负整数解的个数。
即求y1+y2+x3=2的非负整数解,其解的个数为

C(3+2-1,2)=C(4,2)
性质A1∩A3的解的个数,相当于对
(y1+6)+x2+(y3+8)=15求非负整数解的个数。
即求y1+x2+y3=1的非负整数解,其解的个数为
C(3+1-1,1)=C(3,1)

性质A2∩A3的个数,相当于对
x1+(y2+7)+(y3+8)=15求非负整数解的个数。
即求x1+y2+y3=0的非负整数解,其解的个数为
C(3+0-1,0)=C(2,0)

性质A1∩A2∩A3的个数,相当于对
(y1+6)+(y2+7)+(y3+8)=15求非负整数解的个数。
即求y1+y2+y3=-6的非负整数解,其解的个数0

B(0)=a(0)-a(1)+a(2)-a(3)
=C(17,2)-(c(11,2)+C(10,2)+C(9,2))+(c(4,2)+C(3,1)+C(2,0))-0
=10

试题可见:https://www.cnblogs.com/yuiffy/p/3909970.html

(CF451E Devu and Flowers (隔板法 容斥原理 Lucas定理 求逆元))

如果是求方程x1+x2+x3<=15的整数解的数目

则可认为有3+15个位置,然后将三个变量随便放,即有C(15+3,3)种解。

样关例题见:https://begin.lydsy.com/JudgeOnline/problem.php?id=3957

如果x1,x2,x3有一些限制的话,则根据上题的做法进行变换就好了。

相关例题:Bzoj3027 Sweet(当然这个题也可以用母函数的方法来求解,见下面这个Link)

https://www.cnblogs.com/cutemush/p/11988461.html

#include<bits/stdc++.h>
#define maxn 2005
#define mod 2004
#define pii pair<int,int>
#define F first
#define S second
#define mp make_pair
#define LL long long
using namespace std; int n,a,b,m[20],ans; int C(int a,int b){
if(a < b) return 0;
LL fac = 1 , ret = 1;
for(int i=1;i<=b;i++) fac *= i;
LL Mod = fac * mod;
for(int i=1;i<=b;i++)
ret = 1ll * ret * (a-i+1) % Mod;
return ret / fac;
} void dfs(int s,int ad,int xs)
//s代表选到哪个物品了,ad代表方程中需要减去的数字,xs代表系数
//根据广义容斥定理,为总体送去一个个的不满足条件,加上二个二个不满足条件,减去三个三个不满足条件的
//x1+x2+x3<=15的零或正整数解,即要求: x1≥0,x2≥0,x3≥0。
//C(3+15,15)=C(18,3)
{
if(s == n+1)
{
ans = (ans + 1ll * xs * (C(b-ad+n,n) - C(a-1-ad+n,n))) % mod;
return;
}
dfs(s+1,ad,xs);
dfs(s+1,ad+m[s]+1,-xs); //注意 ad+m[s]+1这个系数
} int main(){
scanf("%d%d%d",&n,&a,&b);
for(int i=1;i<=n;i++) scanf("%d",&m[i]);
dfs(1,0,1);
printf("%d\n",(ans+mod)%mod);
}

  

另一个程序,其实差不多,加了个求解过程

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 15
const int mod=2004; int n,l,r,ans;
int a[maxn]; inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
} int C(int n,int m){
if (n<m) return 0;
long long p=mod,ret=1;
for (int i=1;i<=m;i++) p*=i;
for (int i=n-m+1;i<=n;i++) ret=ret*i%p;
return ret/(p/mod)%mod;
} void dfs(int x,int type,int sum,int pps){
if (x>n){ans=(ans+type*C(n+pps-sum,n))%mod; return;}
dfs(x+1,type,sum,pps),dfs(x+1,-type,sum+a[x],pps);
} int solve(int n){ans=0,dfs(1,1,0,n); return (ans+mod)%mod;} int main(){
n=read(),l=read(),r=read();
for (int i=1;i<=n;i++) a[i]=read()+1;
int ans=(solve(r)-solve(l-1)+mod)%mod;
printf("%d\n",ans);
return 0;
}
/*
input
2 4 7
2
3
output 求解:
不受任何限制的解为
x+y<=7
解数为c(9,2)=36
加上限制1,即
x+y<=7,但是x>=3
则相当于方程x+y<=4,其方案数为C(6,2)=15
加上限制2,即
x+y<=7,但是y>=4
则相当于方程x+y<=3,其方案数为C(5,2)=10
如果两个限制都加上则
相当于方程x+y<=7-3-4=0,其方案数为1
于是方程
x+y<=7
0<=x<=2,0<=y<=3的解一共有36-15-10+1=12解 用同样的方法求出
x+y<=3的解,其共有9种 于是对于解题共12-9=3
*/

  

求方程x1+x2+x3=15的整数解的数目的更多相关文章

  1. 对于一般情况X1+X2+X3+……+Xn=m 的正整数解有 (m-1)C(n-1) 它的非负整数解有 (m+n-1)C(n-1)种

    对于一般情况X1+X2+X3+……+Xn=m 的正整数解有 (m-1)C(n-1) 它的非负整数解有 (m+n-1)C(n-1)种

  2. Picard 法求方程根

    要点: 首先对于任何方程 :f(x)=0 ,可以转换成 f(x)+x-x => f(x)+x=x; 取g(x)=f(x)+x;  那么 新方程g(x)=x 的解即是 f(x)=0的解,即g(x) ...

  3. 「浙江理工大学ACM入队200题系列」问题 F: 零基础学C/C++39——求方程的解

    本题是浙江理工大学ACM入队200题第四套中的F题 我们先来看一下这题的题面. 由于是比较靠前的题目,这里插一句.各位新ACMer朋友们,请一定要养成仔细耐心看题的习惯,尤其是要利用好输入和输出样例. ...

  4. C语言之基本算法25—牛顿迭代法求方程近似根

    //牛顿迭代法! /* ============================================================ 题目:用牛顿迭代法求解3*x*x*x-2*x*x-16 ...

  5. bzoj3028食物 关于(1+x+x2+x3+x4+...)^k的第i项系数就是c(i+k−1,k−1)的证明

    关于(1+x+x2+x3+x4+...)^k的第i项系数就是c(i+k−1,k−1)的证明对于第i项,假设为5x^5=x^0*x^5x^5=x^1*x^4x^5=x^2*x^3........也就是说 ...

  6. C++ 2(将类分文件) //点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方

    1 源文件 main.cpp 2 //点和圆的关系 3 //设计一个圆形类 和一个点类 计算点和圆的关系 4 //点到圆心的距离 == 半径 点在圆上 5 //点到圆心的距离 > 半径 点在圆外 ...

  7. C++ 1 (只在源文件)//点和圆的关系 //设计一个圆形类 和一个点类 计算点和圆的关系 //点到圆心的距离 == 半径 点在圆上 //点到圆心的距离 > 半径 点在圆外 //点到圆心的距离 < 半径 点在圆内 //点到圆心的距离 获取 ....... (x1 -x2)^2 + (y1-y2)^2 开根号 和半径对比 // 计算 可以 两边同时 平方

    1 //点和圆的关系 2 //设计一个圆形类 和一个点类 计算点和圆的关系 3 //点到圆心的距离 == 半径 点在圆上 4 //点到圆心的距离 > 半径 点在圆外 5 //点到圆心的距离 &l ...

  8. 有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M。 需要选出若干个x,使这几个x的和与 M 最接近。 请描述实现算法,并指出算法复杂度

    题目:有N个正实数(注意是实数,大小升序排列) x1 , x2 ... xN,另有一个实数M. 需要选出若干个x,使这几个x的和与 M 最接近. 请描述实现算法,并指出算法复杂度. 代码如下: #in ...

  9. Problem J: 求方程的解——C语言初学者百题大战之十五

    #include<stdio.h> #include<math.h> int main() { float a,b,c,x1,x2,delta; scanf("%f ...

随机推荐

  1. jquery preventDefault() 方法防止打开不是本站的链接URL

    将以下代码保存为test.html,用浏览器打开即可测试 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&q ...

  2. [Python模块]Windows环境安装PyV8并执行js语句

    安装这个玩意儿真挺坑的,pip直接安装失败,windows的py库压根搜不到.. 搜索良多解决办法终于找到了,在这里贴出来,主要是把这个库下载下来再安装,但它的下载地址HERE位于外面的世界(你懂得) ...

  3. XGboost数据比赛实战之调参篇(完整流程)

    这一篇博客的内容是在上一篇博客Scikit中的特征选择,XGboost进行回归预测,模型优化的实战的基础上进行调参优化的,所以在阅读本篇博客之前,请先移步看一下上一篇文章. 我前面所做的工作基本都是关 ...

  4. MongoDB 副本集+分片 认证方式搭建

    MongoDB 副本集+分片 认证方式搭建 参考资料: https://www.cnblogs.com/ityouknow/p/7344005.htmlhttps://jorwen-fang.itey ...

  5. NOIP提高组2016总结

    前言 大翻车! 300--: day1 8:30~9:00, 照常看题,思考. 9:00~9:15, 搞定第一题,很水. 9:15~9:45, 思考第二题,我考虑用分深度来处理,想出个个玄学暴力,但刚 ...

  6. 【leetcode】1219. Path with Maximum Gold

    题目如下: In a gold mine grid of size m * n, each cell in this mine has an integer representing the amou ...

  7. 对TypeScript进行研究

    1.npm install -g typescript 在编辑器,将下面的代码输入到greeter.ts文件里: function greeter(person) { return "Hel ...

  8. 对flex深入研究一点

    flex顶层设计 1.在任何流动的方向上(包括上下左右)都能进行良好的布局 2.可以以逆序 或者 以任意顺序排列布局 3.可以线性的沿着主轴一字排开 或者 沿着侧轴换行排列 4.可以弹性的在任意的容器 ...

  9. Java面试之持久层(10)

    91,什么是ORM?         对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术: 简单的说,O ...

  10. MySQL的视图和索引

    MySQL的视图 简单来说MySQL的视图就是对SELECT 命令的定义的一个快捷键,我们查询时会用到非常复杂的SELECT语句,而这个语句我们以后还会经常用到,我们可以经这个语句生产视图.视图是一个 ...