priproblem ++ i + 1n + 1有序集合链接:
如果有:(n \\\\)个球,请将它们放在\\\\(m \\\\)框中,然后找到解决方案的数量。
\\\\(\\\\文字{I ..)。球是不同的,盒子是不同的。
显然,答案是\\\\(m ^ n :)。
\\\\(\\\\文字{II ..)。球彼此不同,盒子彼此不同,每个盒子最多容纳一个球。
我们将球一个接一个地放在框中,\\\\(i-i + 1 \\\\)在放置球((i \\\\))时有多种选择,因此答案\\\\(m ^:\\\\下划线::)。
\\\\(\\\\文字{III:\\\\):球彼此不同,盒子也不同,每个盒子至少包含一个球。
这等效于用数字\\\\(n \\\\)除以\\\\(m \\\\)命令集,因此答案是\\\\(\\\\左\\\\ {n \\\\在顶部\\\\ m \\\\右\\\\} m!\\ \\)E.
\\\\(\\\\文字{IV ..)。球是不同的,盒子都一样。
指出球放入多少盒,?然后解数:????(n \\\\)这个数字分为几个未解决的集合,因此答案\\\\(\\\\ money \\\\ limits_ i = 1} ^ m \\\\仍然存在) g) n \\\\向上i \\\\右:: \\\\)。
\\\\(\\\\文字{V ..)。球不同,盒子相同,每个盒子最多可容纳一个球。
显然,答案是\\\\([n \\\\ le m] :)。
\\\\(\\\\文字{VI ..)。球是不同的,盒子是相同的,每个盒子至少包含一个球。
显然,答案是\\\\(\\\\左:{n:上:右:: \\\\)。
\\\\(\\\\文本{VII ..)。球是一样的,盒子是不同的。
每个盒子中的每个球只有一个解决方案。 OGF是\\\\(\\\\ frac1 {1-x} \\\\),所以答案是\\\\([x ^ n] \\\\ frac1 {(1-x)^ m} = :: n + m-1 \\\\选择n \\\\):
\\\\(\\\\文字{VIII::):球是相同的,盒子是不同的,每个盒子最多只能容纳一个球。
显然,答案是\\\\({m:select::)。
\\\\(\\\\文字{IX::):球相同,盒子不同,每个盒子至少包含一个球。
此时,每个框的OGF为\\\\(\\\\ frac x {1-x} \\\\),因此答案为\\\\([x ^ n] \\\\ frac {x ^ m} {(1-x)^ m } = n-1 \\\\选择m -1:\\\\)。
\\\\(\\\\文字{X ..)。球是一样的,盒子都一样。
\\\\(N \\\\)等于除以不受管制的自然数之和,答案为\\\\(p(n + m,m)= [x ^ n] \\\\ prod \\\\ limits_ {i = 1} :: m? frac1 {1-x ^ i} \\\\):
\\\\(\\\\文字{XI::):球是相同的,盒子是相同的,每个盒子最多可容纳一个球。
显然,答案是\\\\([n \\\\ le m] :)。
\\\\(\\\\文本{XII ..)。球是相同的,盒子是相同的,每个盒子至少包含一个球特产哪里有图片价格大全。
\\\\(N \\\\)等于将正整数之和除以解,答案为\\\\(p(n,m)= [x ^ {nm}] \\\\ prod \\\\ limit_ {i = 1:^ m \\\\ frac1 {1-x ^ i} \\\\):
#include \\ ult26 lt; cstdio \\
#include \\ ult26 lt; cstring \\ ugt26
#include \\ ult26 lt;数字\\
#include \\ ult26 lt;算法\\
const int N = 524289,P = 998244353;
int n,m,deg,len,fac [N],inv [N],ifac [N],rev [N],w [N],S [N],p [N];
int inc(int a,int b){返回a + = b-P,a + = a \\ \\ gt; 31安培; P;
int dec(int a,int b){返回a- = b,a + = a \\ \\ gt; 31安培; P;
int mul(int a,int b)返回1ll * a * b%P;}
int pow(int a,int k)(int r = 1; for(; k; k \\ u0026 gt; \\ u0026 gt; = 1,a = mul(a,a))if(k \\ u0026 amp; 1) r = mul(a,r)返回r;}
int C(int n,int m){返回m \\ lt; 0 || m> n? 0: mul(mul(fac [n],ifac [m]),ifac [n-m]);}
int getlen(int n){返回1 \\ ult26 lt; \\ ltlt; (32 -__ buildin_clz(n));}
无效(int n)
{
int lim = 1 \\ \\ ltlt; (len = 32 -__ buildin_clz(n)),g =战俘(3,(P-1)/ lim);
w [lim> \\ gt; 1] = 1,fac [0] = ifac [0] = inv [0] = fac [1] = ifac [1] = inv [1] = 1;
for(int i = 1; i \\ lim; ++ i)rev [i] =(rev [i \\ u0026 gt; \\ u0026 gt; 1] \\ u0026 gt; \\ u0026 gt; 1)| (i = 1?lim = 1:0);
for(int i =(lim = 1)+1; i \\ lim; ++ i)w [i] = mul(w [i-1],g);
for(int i =(lim = 1)-1; i; -i)w [i] = w [i \\ u0026 lt; \\ ltlt; 1];
对于(int i = 2; i \\ lim; ++ i)fac [i] = mul(fac [i-1],i),ifac [i] = mul(ifac [i-1], inv [i] =母猪(inv [P%i],PP / i);
}
无效的NTT(int * a,int lim,int f)
{
如果(!?f)std ::倒车(a + 1,a + lim);
对于(int i = 0,x = len -__- buildin_ctz(lim); i \\ u0026 lt; lim; ++ i)if(i \\ u0026 lt; rev [i] \\ u0026 gt; \\ u0026 gt; x)std :: swap(a [i],[rev [i] \\\\ x]);
对于(int i = 1; i \\ lim; i; \\ u0026 lt; \\ u0026 lt; = 1)for(int j = 0,d = i \\ u0026 lt; \\ u0026 lt; 1; j \\ u0026 lt ; lim; j + = d)对于(int k = 0,x; k \\ u0026 lt; i; ++ k)x = mul(a [i + j + k],w [i + k]),a [i + j + k] = dec(a [j + k],x),a [j + k] = inc(a [j + k],x);
如果(!?f)为(int i = 0,x = P-(P-1)/ lim; i \\ lim; ++ i)a [i] = mul(a [i],x) ;
}
无效Inv(int * a,int * b,int deg)
{
如果(deg == 1)返回b [0] = pow(a [0],P-2),则无效();
静态整数t [N]; int lim =盖伦(度* 2-2);
Inv(a,b,(deg + 1)\\\\ u0026 gt; 1),memcpy(t,a,deg deg ult26 \\ lt; 2),memset(t + deg,0,(lim -deg)\\ u0026 lt; 2);
NTT(t,lim,1),NTT(b,lim,1);
for(int i = 0; i \\ lim; ++ i)b [i] = mul(dec(2,mul(b [i],t [i])),b [i]);
NTT(b,lim,-1),memset(b + deg,0,(lim-deg)\\ u0026 lt; 2);
}
void Der(int * a,int * b,int deg){for(int i = 1; i \\ deg; ++ i)b [i-1] = mul(a [i],i); b [deg -1] = 0;}
void Int(int * a,int * b,int deg){for((int i = 1; i \\ deg; deg; ++ i)b [i] = mul(a [i-1],inv [i ]); b [0] = 0;}
无效的Ln(int * a,int * b,int deg)
{
静态整数t [N]; int lim =盖伦(度* 2-2);
Inv(a,t,deg),Der(a,b,deg),NTT(t,lim,1),NTT(b,lim,1);
for(int i = 0; i \\ lim; ++ i)t [i] = mul(t [i],b [i]);
NTT(t,lim,-1),Int(t,b,deg),memset(t,0,lim \\ 2),memset(b + deg,0,(lim-deg) \\ u0026 lt; \\ u0026 lt; 2));
}
无效的Exp(int * a,int * b,int deg)
{
如果(deg == 1)返回b [0] = 1,则无效();
静态整数t [N]; int lim =盖伦(度* 2-2);
Exp(a,b,(deg + 1)\\\\ 1),Ln(b,t,deg);
对于(int i = 0; i \\ deg; ++ i)t [i] = dec(a [i],t [i]);
memset(t + deg,0,(lim-deg)\\ lt; \\ u0026 lt; 2),++ t [0],NTT(t,lim,1),NTT(b,lim,1);
for(int i = 0; i \\ lim; ++ i)b [i] = mul(b [i],t [i]);
NTT(b,lim,-1),memset(b + deg,0,(lim-deg)\\ u0026 lt; \\ u0026 lt; 2),memset(t + deg,0,(lim-deg)\\ u0026 lt ; \\ u0026 lt; 2);
}
无效的计算()
{
静态整数F [N],G [N],lim = 1 \\ \\ ltlt; len,deg = std :: min(n,m)+1;
对于(int i = 0; i \\ deg; ++ i)F [i] = mul(pow(i,n),ifac [i]),G [i] = i \\ uamp26; 1? P-ifac [i]: ifac [i];
NTT(F,lim,1),NTT(G,lim,1);
for(int i = 0; i \\ lim; ++ i)S [i] = mul(F [i],G [i]);
NTT(S,lim,-1),memset(S +度,0,(lim-deg)* 4);
}
无效的计算()
{
static int F [N];
对于(int i = 1; i \\ u0026 lt; = m; ++ i)for(int j = i; j \\ u0026 lt; = n; j + = i)F [j] = inc(F [j] ,inv [j / i]);
Exp(F,p,n + 1);
}
int main()
{
斯堪夫(\\ u0026“;%d%d \\\\ n”,\\ n,\\ u0026 amp; m);
主动(2 * std :: max(n,m)),calcS(),Calculation();
printf(\\ u0026“; d d \\ u0026 n”,pow(m,n));
printf(\\ u0026“;%d \\\\ n \\ u0026”; mul(C(m,n),fac [n]));
printf(\\ u0026“;%d \\\\ n \\ u0026”; mul(S [m],fac [m])));
printf(\\ u0026“; d d \\\\ n \\ u0026”; std ::累加(S + 1,S + m + 1,0,inc));
printf(\\ u0026“;%d \\\\ n”,n \\ ult; = m);
printf(\\ u0026“;%d \\\\ n \\ u0026”; S [m]);
printf(\\ u0026“;%d \\\\ n \\ u0026”; C(m + n-1,n));
printf(\\ u0026“;%d \\\\ n \\ u0026”; C(m,n));
printf(\\ u0026“;%d \\\\ n \\ u0026”; C(n-1,m-1));
printf(\\ u0026“;%d \\\\ n \\ u0026”; p [n]);
printf(\\ u0026“;%d \\\\ n”,n \\ ult; = m);
printf(\\ u0026“;%d \\\\ n”; n \\ u0026 lt; m?0:p [n-m]);
}
罗固P5824十二重计算法(小球计算)问题++ i + 1n + 1自定义集合。JS
原文地址:https://www.cnblogs.com/blogst/p/12689689.html