题面:BZOJ传送门
题目让我们求这些物品在合法范围内任意组合,一共组合出$n$个物品的方案数
考虑把每种食物都用生成函数表示出来,然后用多项式乘法把它们乘起来,第$n$项的系数就是方案数
汉堡:$1+x^{2}+x^{4}+x^{4}...=\frac{1}{1-x^{2}}$
可乐:$1+x$
鸡腿:$1+x+x^{2}$
蜜桃:$x+x^{3}+x^{5}+x^{7}...=\frac{x}{1-x^{2}}$
鸡块:$1+x^{4}+x^{8}+x^{12}..=\frac{1}{1-x^{3}}$
包子:$1+x+x^{2}+x^{3}=(1+x)(1+x^{2})$
土豆:$1+x$
面包:$1+x^{3}+x^{6}+x^{9}...=\frac{1}{1-x^{3}}$
数据范围非常大,直接上生成函数会炸,而且模数也不支持$NTT$
把这些多项式乘起来,化简可得$f(x)=\frac{x}{(1-x)^{4}}$
一种做法是求导,再代入泰勒展开,然而我太弱了并没有推明白式子
$f(x)=\frac{x}{(1-x)^{4}}=x(\frac{1}{(1-x)})^{4}$
考虑$\frac{1}{1-x}$的本质,就是$1+x+x^{2}+x^{3}...$
而它的四次方就是$1+4x+10x^{2}+20x^{3}..$
即$C_{3}^{0}+C_{4}^{1}x+C_{5}^{2}x^{2}+C_{6}^{3}x^{3}...$
这不就是个躺着的杨辉三角么,那么第$n$项的结果就是$C_{n+3}^{n}$
然而还有一项$x$没算进去,相当于把整个多项式右移一位,即答案左移一位
最终答案变成了$C_{n+2}^{n-1}$
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
#define dd double
#define N1 1010
using namespace std; const int mod=; int gint()
{
int ret=,fh=; char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
} void exgcd(ll a,ll b,ll &x,ll &y)
{
if(!b){ x=; y=; return; }
exgcd(b,a%b,x,y); ll t=x; x=y; y=t-a/b*y;
}
char str[N1];
int a[N1],n; int main()
{
scanf("%s",str+);
int ret=,i; n=strlen(str+);
for(i=;i<=n;i++) ret=(ret*+str[i]-'')%mod;
ll inv,invy; ret=1ll*(ret+)*(ret+)%mod*(ret)%mod;
exgcd(,mod,inv,invy); inv=(inv%mod+mod)%mod; ret=1ll*ret*inv%mod;
exgcd(,mod,inv,invy); inv=(inv%mod+mod)%mod; ret=1ll*ret*inv%mod;
printf("%d\n",ret);
return ;
}