为何本题无法使用容斥原理呢?

P6078 [CEOI2004] Sweets

啥意思
by Curators @ 2022-01-20 23:34:46


@[CHENHX](/user/239407) 具体说说咋容斥?
by FxorG @ 2022-01-21 00:10:58


@[CHENHX](/user/239407) 和生成函数算出来的是一样的啊,没有本质区别(
by Aleph1022 @ 2022-01-21 06:56:31


@[FxorG](/user/125901) 大力展开生成函数的过程和容斥本质上一致吧
by Aleph1022 @ 2022-01-21 07:00:05


@[GuidingStar](/user/75840) 但是好像就是错了,而且我还打了两遍答案都是一样的,或许您能帮忙看看 ```cpp #include <cstdio> #include <cctype> #include <cstring> #define int long long using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(!isdigit(ch))f^=ch=='-',ch=getchar(); while(isdigit(ch))x=x*10+(ch^48),ch=getchar(); return f?x:-x; } const int N=15,mo=2004; int n,m[N],a,b,cnt[4096],fac=1; int Cm(int n,int m){ if(n<m)return 0; int ret=1,div[15]; memset(div,0,sizeof(div)); for(int i=n;i>n-m;--i){ int x=i; for(int j=1;j<=m;++j){ if(div[j])continue; if((x%j)==0){ x/=j; div[j]=true; } } ret=ret*x%mo; } return ret; } int fk(int x){ if(x&1)return -1; else return 1; } int calc(int x){ int ret=0; for(int i=0;i<(1<<n);++i){ int rest=x; for(int j=1,p=i;p;p>>=1,++j){ if(p&1)rest-=m[j]+1; } ret=(ret+fk(cnt[i])*Cm(rest+n-1,n-1)%mo)%mo; } return (ret%mo+mo)%mo; } signed main(){ n=read(),a=read(),b=read(); for(int i=1;i<=n;++i)m[i]=read(),fac*=i; m[++n]=1e9;fac*=n; for(int i=1;i<(1<<n);++i){ cnt[i]=cnt[i>>1]+(i&1); } printf("%lld\n%lld\n",calc(b),calc(a-1)); int ans=calc(b)-calc(a-1); printf("%lld",(ans+mo)%mo); } ```
by chen_hx @ 2022-01-21 07:48:44


容斥可以。不懂为什么不行。
by Saliеri @ 2022-06-08 16:51:25


可以。我做的容斥https://www.luogu.com.cn/record/78220696
by xkai @ 2022-07-01 20:09:52


@[CHENHX](/user/239407) 可以容斥 [code](https://www.luogu.com.cn/paste/zed89z43) ~~但是我傻逼忘了 n<=10 贺了一份 exlucas~~
by Blowback @ 2023-04-13 11:21:16


|