zoukankan      html  css  js  c++  java
  • 求方程x1+x2+x3=15的整数解的数目

     求方程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
    ",(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
    ",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
    */ 
      
     
    

      

  • 相关阅读:
    ajax、json一些整理(2)
    ajax、json一些整理(1)
    C# DllImport的用法
    asp.net 获取当前项目路径
    C# 中关闭当前线程的四种方式 .
    DataGridView自定义RichTextBox列
    C#winform的datagridview设置选中行
    Other Linker flags 添加 -Objc导致包冲突
    nat打洞原理和实现
    成为顶尖自由职业者必备的七个软技能之四:如何成为销售之王(转)
  • 原文地址:https://www.cnblogs.com/cutemush/p/11906644.html
Copyright © 2011-2022 走看看