[Tjoi2016&Heoi2016]求和

Description

在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心。

现在他想计算这样一个函数的值:

S(i, j)表示第二类斯特林数,递推公式为:

S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1。

边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i)

你能帮帮他吗?

Input

输入只有一个正整数

Output

输出f(n)。由于结果会很大,输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果即可。1 ≤ n ≤ 100000

Sample Input

3

Sample Output

87
明天再写。。。。。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int N=100000;
 8 int G=3,Mod=998244353;
 9 int a[8*N],fac[5*N],R[8*N],ifac[5*N],inv[5*N],c[5*N],b[8*N],ans,n;
10 int qpow(int x,int y)
11 {
12   int res=1;
13   while (y)
14     {
15       if (y&1) res=1ll*res*x%Mod;
16       x=1ll*x*x%Mod;
17       y>>=1;
18     }
19   return res;
20 }
21 void NTT(int *A,int len,int o)
22 {int wn,w,i,j,k,x,y;
23   for (i=0;i<len;i++)
24     if (i<R[i]) swap(A[i],A[R[i]]);
25   for (i=1;i<len;i<<=1)
26     {
27       wn=qpow(G,(Mod-1)/(i<<1));
28       if (o==-1) wn=qpow(wn,Mod-2);
29       for (j=0;j<len;j+=(i<<1))
30     {
31       w=1;
32       for (k=0;k<i;k++,w=1ll*w*wn%Mod)
33         {
34           x=A[j+k];y=1ll*w*A[j+k+i]%Mod;
35           A[j+k]=x+y;
36           if (A[j+k]>=Mod) A[j+k]-=Mod;
37           A[j+k+i]=x-y;
38           if (A[j+k+i]<0) A[j+k+i]+=Mod;
39         }
40     }
41     }
42   if (o==-1)
43     {
44       int tmp=qpow(len,Mod-2);
45       for (i=0;i<len;i++)
46     A[i]=1ll*A[i]*tmp%Mod;
47     }
48 }
49 int main()
50 {int i,len,lg;
51   cin>>n;
52   fac[0]=fac[1]=ifac[0]=ifac[1]=inv[1]=1;
53   for (i=2;i<=n;i++)
54     {
55       fac[i]=1ll*fac[i-1]*i%Mod;
56       inv[i]=1ll*(Mod-Mod/i)*inv[Mod%i]%Mod;
57       ifac[i]=1ll*ifac[i-1]*inv[i]%Mod;
58     }
59   for (i=0;i<=n;i++)
60     if (i%2==0)
61       a[i]=ifac[i];
62     else a[i]=(Mod-ifac[i])%Mod;
63   b[0]=1;b[1]=n+1;
64   for (i=2;i<=n;i++)
65     b[i]=1ll*(qpow(i,n+1)-1)*inv[i-1]%Mod*ifac[i]%Mod,b[i]=(b[i]+Mod)%Mod;
66   len=1;
67   while (len<=2*n) len*=2,lg++;
68   for (i=0;i<len;i++)
69     R[i]=(R[i>>1]>>1)|((i&1)<<(lg-1));
70   NTT(a,len,1);NTT(b,len,1);
71   for (i=0;i<len;i++)
72     a[i]=1ll*a[i]*b[i]%Mod;
73   NTT(a,len,-1);
74   for (i=0;i<=n;i++)
75     ans=1ll*(ans+1ll*qpow(2,i)*fac[i]%Mod*a[i]%Mod)%Mod;
76   cout<<ans;
77 }

原文地址:https://www.cnblogs.com/Y-E-T-I/p/8379700.html

时间: 2024-10-09 04:15:48

[Tjoi2016&Heoi2016]求和的相关文章

【BZOJ4555】[Tjoi2016&amp;Heoi2016]求和 NTT

[BZOJ4555][Tjoi2016&Heoi2016]求和 Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1. 边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i) 你能帮帮他吗? Input 输入

【BZOJ】4555: [Tjoi2016&amp;Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT

[题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016&Heoi2016]求和-NTT-多项式求逆 $ans=\sum_{i=0}^{n}\sum_{j=0}^{i}s(i,j)*2^j*j!$ 令$g(n)=\sum_{j=0}^{n}s(n,j)*2^j*j!$ 则ans是Σg(i),只要计算出g(i)的生成函数就可以统计答案. g(n)可以理解为将n个数划分

bzoj 4555 [Tjoi2016&amp;Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化

[Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 679  Solved: 534[Submit][Status][Discuss] Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j &l

【BZOJ 4555】[Tjoi2016&amp;Heoi2016]求和 NTT+第二类斯特林数

用到第二类斯特林数的性质,做法好像很多,我打的是直接ntt,由第二类斯特林数的容斥公式可以推出,我们可以对于每一个i,来一次ntt求出他与所有j组成的第二类斯特林数的值,这个时候我们是O(n^2logn)的,还不如暴力,但是我们发现,对于刚刚提到的容斥的式子,将其化为卷积形式后,其一边的每一项对于每一个i都相同,另一边的每一项是对于所有的i形成一个n项的等比数列,这样我们可以把成等比数列的一边求和,用固定的一边去卷他们的和,这时候的答案的每一项就是所有的i的这一项的和,然后我们再O(n)乘上阶乘

Bzoj4555 [Tjoi2016&amp;Heoi2016]求和

Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 327  Solved: 262 Description 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ∗ S(i − 1, j) + S(i − 1, j − 1), 1 <= j <= i − 1. 边界条件为:S(i, i) = 1(0 <= i), S(i, 0) =

4555: [Tjoi2016&amp;Heoi2016]求和

我们省选的题- 考虑这个式子的组合意义,对于每一个i,枚举j表示将i个小球放入j个有序集合,且每个集合选择或者不选的方案数. 我们用f[i]表示将i个小球放入任意个有序集合,且每个集合选择或不选的方案数,则枚举最后一个集合的大小i-j,可以得到递推式: for(int i = 1;i <=n ;i ++) for(int j = 0;j < i ;j ++)f[i]=(f[i]+f[j]*c[i][j]*2); c[i][j]是组合数. 意义就是有j个小球任意组合,剩下的组成最后一个集合,且这

[BZOJ4555][TJOI2016&amp;HEOI2016]求和(分治FFT)

解法一:容易得到递推式,可以用CDQ分治+FFT 代码用时:1h 比较顺利,没有低级错误. 实现比较简单,11348ms #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=l; i<=r; i++) typedef long long ll; using namespace std; const int N=(1<<18)+100,P=998244353,g=3; int n,re

BZOJ4555 [Tjoi2016&amp;Heoi2016]求和 【第二类斯特林数 + NTT】

题目 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: S(i, j)表示第二类斯特林数,递推公式为: S(i, j) = j ? S(i ? 1, j) + S(i ? 1, j ? 1), 1 <= j <= i ? 1. 边界条件为:S(i, i) = 1(0 <= i), S(i, 0) = 0(1 <= i) 你能帮帮他吗? 输入格式 输入只有一个正整数 输出格式 输出f(n).由于结果会很大,输出f(n)对998244353(7

BZOJ 4553 Tjoi2016&amp;Heoi2016 序列

Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你 ,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可 .注意:每种变化最多只有一个值发生变化.在样例输入1中,所有的变化是: 1 2 3 2 2 3 1 3 3 1 1 31 2 4