您的位置:首页 > 大数据 > 物联网

日常训练 Idiot 的方程

2017-05-26 18:36 211 查看
题意简述:求以下不定方程非负整数解的组数 :∑ni=1Xi=m 0≤Xi≤li,i=1,2,3,…,n

数据范围:n≤20,m≤1018,li≤m

一开始毫无想法,因为上限限制只能背包,不能隔板,就是没想到容斥。

问题如果是有下界限制很好解决,所以容斥一发(感觉容斥好像有条件反向的作用),下界限制用隔板即可。

智障的我又忘记+P再取模了。

#include<bits/stdc++.h>
typedef long long ll;
const int N = 25;
const int P = 1234567891;
int n;
ll m,l
,inv
,ans;
ll ksm(ll x, int k){
ll ans = 1;
for (; k; k>>=1, x = x * x % P)
if (k & 1) ans = ans * x % P;
return ans;
}
ll C(ll n, ll k){
if (n < k) return 0;
ll ans = 1;
for (ll i=n; i>n-k; i--)
ans = ans * (i % P) % P;
for (int i=k; i>0; i--)
ans = ans * inv[i] % P;
return ans;
}
int main(){
scanf("%d%lld",&n,&m);
for (int i=1; i<=n; i++)
scanf("%lld",&l[i]);
for (int i=1; i<=n; i++)
inv[i] = ksm(i,P - 2);
int all = 1 << n;
for (int S=0; S<all; S++){
ll temp = m + n - 1, k = 1;
for (int i=1; i<=n; i++)
if (S & (1 << (i-1)))
temp -= l[i] + 1,
k *= -1;
ans += C(temp,n-1) * k;
}
printf("%lld\n",(ans % P + P) % P);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  容斥原理