思路

和玩游戏一题类似

定义\(A_k(x)=\sum_{i=0}^\infty a_k^ix^i=\frac{1}{1-a_kx}\)

用\(\ln 'x\)代替\(\frac{1}{x}\),

所以就是求

\[f(x)=\sum_{i=1}^n \ln'(1-a_ix)
\]

这样没法快速计算

所以再设\(G(x)=\sum _{i=1}^n (ln(1-a_ix))'\)

所以

\[G(x)=\sum_{i=1}^n\frac{-a_i}{1-a_ix}
\]

所以

\[f(x)=-xg(x)+n
\]

\[G(x)=\ln'(\prod_{i=1}^n (1-a_ix))
\]

然后上分治+NTT就可以在\(O(n\log^2n)\)的时间内解决了

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#define int long long
using namespace std;
const int MOD = 998244353;
const int G = 3;
const int invG = 332748118;
const int MAXN = 2000000;
int pow(int a,int b){
int ans=1;
while(b){
if(b&1)
ans=(1LL*ans*a)%MOD;
a=(1LL*a*a)%MOD;
b>>=1;
}
return ans;
}
int rev[MAXN],inv_val[MAXN];
void cal_rev(int n,int lim){
for(int i=0;i<n;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)<<(lim-1));
}
void cal_inv(int n){
inv_val[0]=0;
inv_val[1]=1;
for(int i=2;i<=n;i++)
inv_val[i]=(1LL*(MOD-MOD/i)*inv_val[MOD%i])%MOD;
}
void NTT(int *a,int opt,int n,int lim){
for(int i=0;i<n;i++)
if(i<rev[i])
swap(a[i],a[rev[i]]);
for(int i=2;i<=n;i<<=1){
int len=i/2,tmp=pow((opt)?G:invG,(MOD-1)/i);
for(int j=0;j<n;j+=i){
int arr=1;
for(int k=j;k<j+len;k++){
int t=(1LL*a[k+len]*arr)%MOD;
a[k+len]=(a[k]-t+MOD)%MOD;
a[k]=(a[k]+t)%MOD;
arr=(1LL*arr*tmp)%MOD;
}
}
}
if(!opt){
int invN = pow(n,MOD-2);
for(int i=0;i<n;i++)
a[i]=(1LL*a[i]*invN)%MOD;
}
}
void mul(int *a,int *b,int &at,int bt){
int midlen=1,midlim=0;
while((midlen)<(at+bt+2))
midlen<<=1,midlim++;
cal_rev(midlen,midlim);
static int tmp[MAXN];
for(int i=0;i<midlen;i++)
tmp[i]=b[i];
NTT(a,1,midlen,midlim);
NTT(tmp,1,midlen,midlim);
for(int i=0;i<midlen;i++)
a[i]=(1LL*a[i]*tmp[i])%MOD;
NTT(a,0,midlen,midlim);
at+=bt;
for(int i=0;i<=at;i++)
tmp[i]=0;
for(int i=at+1;i<midlen;i++)
a[i]=0,tmp[i]=0;
}
void inv(int *a,int *b,int dep,int &midlen,int &midlim){
if(dep==1){
b[0]=pow(a[0],MOD-2);
return;
}
inv(a,b,(dep+1)>>1,midlen,midlim);
static int tmp[MAXN];
while((dep<<1)>midlen)
midlen<<=1,midlim++;
for(int i=0;i<dep;i++)
tmp[i]=a[i];
for(int i=dep;i<midlen;i++)
tmp[i]=0;
cal_rev(midlen,midlim);
NTT(tmp,1,midlen,midlim);
NTT(b,1,midlen,midlim);
for(int i=0;i<midlen;i++)
b[i]=(1LL*b[i]*(2-1LL*tmp[i]*b[i]%MOD+MOD)%MOD)%MOD;
NTT(b,0,midlen,midlim);
for(int i=dep;i<midlen;i++)
b[i]=0;
}
void qd(int *a,int &t){
for(int i=0;i<t;i++)
a[i]=1LL*a[i+1]*(i+1)%MOD;
a[t]=0;
t--;
}
void jf(int *a,int &t){
t++;
for(int i=t;i>0;i--){
a[i]=1LL*a[i-1]*inv_val[i]%MOD;
}
a[0]=0;
}
void ln(int *a,int *b,int n){
static int tmp[MAXN];
for(int i=0;i<n;i++)
tmp[i]=0,b[i]=a[i];
int midlen=1,midlim=0;
inv(a,tmp,n,midlen,midlim);
int t=n;
qd(b,t);
mul(b,tmp,t,n);
jf(b,t);
for(int i=0;i<n;i++)
tmp[i]=0;
for(int i=n;i<midlen;i++)
b[i]=tmp[i]=0;
}
int n,a[MAXN],b[MAXN],c[MAXN];
int cnt=0,barrel[40][MAXN];
void solve(int l,int r,int *val,int &len){
if(l==r){
val[0]=1;
val[1]=MOD-a[l];
len=1;
return;
}
int *la=barrel[cnt++],*ra=barrel[cnt++];
int num=cnt,lenl,lenr;
// printf("num=%lld\n",cnt);
int mid=(l+r)>>1;
solve(l,mid,la,lenl);
solve(mid+1,r,ra,lenr);
int midlen=1,midlim=0;
while(midlen<(lenl+lenr+2))
midlen<<=1,midlim++;
cal_rev(midlen,midlim);
NTT(la,1,midlen,midlim);
NTT(ra,1,midlen,midlim);
for(int i=0;i<midlen;i++)
val[i]=(1LL*la[i]*ra[i])%MOD;
NTT(val,0,midlen,midlim);
for(int i=0;i<midlen;i++)
la[i]=ra[i]=0;
len=lenl+lenr;
cnt=num-2;
}
signed main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
int T;
scanf("%lld",&T);
while(T--){
// printf("ok %lld\n",T);
scanf("%lld",&n);
cal_inv(n+10);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
int len=0;
solve(1,n,b,len);
// for(int i=0;i<=n;i++)
// printf("%lld ",b[i]);
// printf("\n");
ln(b,c,n+1);
// for(int i=0;i<=n;i++)
// printf("%lld ",c[i]);
// printf("\n");
int t=n;
qd(c,t);
for(int i=n;i>=1;i--)
c[i]=MOD-c[i-1];
c[0]=n;
// for(int i=0;i<=n;i++)
// printf("%lld ",c[i]);
// printf("\n");
// for(int i=1;i<=n;i++)
// printf("%lld ",c[i]);
// printf("\n");
int ans=0;
for(int i=1;i<=n;i++)
ans^=c[i];
printf("%lld\n",ans);
for(int i=0;i<=n;i++)
a[i]=b[i]=c[i]=0;
}
return 0;
}

LOJ 2409「THUPC 2017」小 L 的计算题 / Sum的更多相关文章

  1. LOJ#2409. 「THUPC 2017」小 L 的计算题 / Sum(生成函数)

    题意 给定一个长为 \(n\) 的序列 \(\{a_i\}\) 对于 \(k \in [1, n]\) 求 \[ f_k = \sum_{i = 1}^{n} a_i^k \pmod {9982443 ...

  2. 题解 「THUPC 2017」小 L 的计算题 / Sum

    题目传送门 题目大意 给出 \(a_{1,2,...,n}\),对于 \(\forall k\in [1,n]\) ,求出: \[\sum_{i=1}^{n}a_i^k \] \(n\le 2\tim ...

  3. LOJ 2288「THUWC 2017」大葱的神力

    LOJ 2288「THUWC 2017」大葱的神力 Link Solution 比较水的提交答案题了吧 第一个点爆搜 第二个点爆搜+剪枝,我的剪枝就是先算出 \(mx[i]\) 表示选取第 \(i \ ...

  4. @loj - 2977@ 「THUSCH 2017」巧克力

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 「人生就像一盒巧克力,你永远不知道吃到的下一块是什么味道.」 明 ...

  5. LOJ #2978「THUSCH 2017」杜老师

    听说LOJ传了THUSC题赶紧上去看一波 随便点了一题都不会做想了好久才会写暴力爆了一发过了... LOJ #2978 题意 $ T$次询问,每次询问$ L,R$,问有多少种选取区间中数的方案使得选出 ...

  6. LOJ 2980 「THUSCH 2017」大魔法师——线段树

    题目:https://loj.ac/problem/2980 线段树维护矩阵. 然后是 30 分.似乎是被卡常了?…… #include<cstdio> #include<cstri ...

  7. LOJ 2979 「THUSCH 2017」换桌——多路增广费用流

    题目:https://loj.ac/problem/2979 原来的思路: 优化连边.一看就是同一个桌子相邻座位之间连边.相邻桌子对应座位之间连边. 每个座位向它所属的桌子连边.然后每个人建一个点,向 ...

  8. LOJ 2978 「THUSCH 2017」杜老师——bitset+线性基+结论

    题目:https://loj.ac/problem/2978 题解:https://www.cnblogs.com/Paul-Guderian/p/10248782.html 第 i 个数的 bits ...

  9. LOJ 2997 「THUSCH 2017」巧克力——思路+随机化+斯坦纳树

    题目:https://loj.ac/problem/2977 想到斯坦纳树.但以为只能做 “包含一些点” 而不是 “包含一些颜色” .而且不太会处理中位数. 其实 “包含一些颜色” 用斯坦纳树做也和普 ...

随机推荐

  1. Logstash - Working with plugins(使用插件)

    本章节开始介绍logstash的插件及功能,插件对于logstash来说非常重要,按类别分为:input.filter.codec.output四种类型. logstash有非常丰富的插件,通过安装目 ...

  2. 骑士(树形dp)

    题意:给你一个基环树森林,每个点有一个权值,一条边上的两个节点不能同时选择.选取任意个节点,求最大权值和 对于每颗基环树:找环→断边→树形dp(没有上司的舞会) #include<iostrea ...

  3. kubernetes集群应用部署实例

    今天,我们将要带来入门hello world示例,它是一个web留言板应用,基于PHP+Redis的两层分布式架构的web应用,前端PHP web网站通过访问后端Redis数据库完成用户留言的查询和添 ...

  4. 【技巧】-NO.123.数据处理技巧

    Style:Mac Series:Java Since:2018-09-10 End:2018-09-10 Total Hours:1 Degree Of Diffculty:5 Degree Of ...

  5. table-cell width:1% 深入理解

    问题描述 今天在使用Bootstrap给页面添加底部导航栏时,需要在手机下也使导航栏呈现水平排列的效果.最后在网上查找解决方法是,看到这样一个解决方法: .nav-justified > li ...

  6. JMeter-正则表达式(HTML)

    2019-04-26问题:需要取出交易成功,但是有黄色部分 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  7. npm手册

    npm现在都是随同NodeJS一起安装的包管理和分发工具,所以npm的安装,只要下载新版的nodejs已经集成了npm. 安装好了以后,直接输入npm或者npm help,会出来一些npm自带的命令. ...

  8. centOS 7 设置DNS方法 同之前版本不同

    在CentOS 7下,手工设置 /etc/resolv.conf 里的DNS,过了一会,发现被系统重新覆盖或者清除了.和CentOS 6下的设置DNS方法不同,有几种方式: 1.使用全新的命令行工具 ...

  9. Spring增强代理模式

    1. 依赖注入;(掌握) 2. XML自动注入;(掌握) 3. 全注解配置;(掌握) 4. 代理模式;(掌握,难点) 依赖注入 构造参数注入 constructor-arg:构造器注入: index: ...

  10. Go 初体验 - 并发与锁.2 - sync.WaitGroup

    sync包里的WaitGroup主要用于协程同步 计数主协程创建的子线程 WaitGoup.Add(i) 调用清除标记方法WaitGroup.Done() 使用WaitGroup.Wait()来阻塞, ...