uoj50【UR#3】链式反应
题解:
- 令$a(x)$为破坏死光的$EFG$,$f(x)$为方案的$EGF$:$f(x) = x + \int \ \frac{1}{2} f^2(x) a(x) \ dt$;
- 注意到$f(0)=0$,所以考虑如何解:$f'(x) = \frac{1}{2} a(x) f(x)^2 + 1$
- 设$g(f) = 1 + \frac{1}{2}af^2$,即求解$f' = g(f)$;
- 主要思想是牛顿迭代,假设已经求得$f \equiv f_{0} \pmod {x^{n}} $:
- 泰勒展开得:$f' \equiv g(f_{0}) + g'(f_{0})(f - f_{0}) \pmod {x^{2n}} $
- $f' - g'(f_{0})f \equiv g(f_{0}) - g'(f_{0})f_{0} $
- 进一步令:$r \equiv e ^ {\int \ - g'(f_{0}) \ dt}$,(注意有$r' = -g'(f_{0}) r$)
- 两边同时乘以$r$ 得到:
- $f'r - fr' \equiv (g(f_{0}) - g'(f_{0})f_{0}) r$
- $(fr)' \equiv (g(f_{0}) - g'(f_{0})f_{0}) r$
- $ f \equiv \frac{ \int \ (1 - \frac{1}{2}af_{0}^{2})r \ dt }{r} \pmod {x^{2n}}$
- 就可以求了;
- #include<bits/stdc++.h>
- #define mod 998244353
- #define Run(i,l,r) for(int i=l;i<=r;++i)
- #define Don(i,l,r) for(int i=l;i>=r;--i)
- const int N=<<;
- using namespace std;
- int n,a[N],fac[N],ans[N];
- char s[N],ps[],*pp=ps;
- int pw(int x,int y){
- if(y<)y+=mod-;
- int re=;
- for(;y;y>>=,x=1ll*x*x%mod)if(y&)re=1ll*re*x%mod;
- return re;
- }
- void push(char x){
- if(pp==ps+)fwrite(ps,,,stdout),pp=ps;
- *pp++=x;
- }
- void write(int x){
- static int top,sta[];
- if(!x){push(''),push('\n');return;}
- while(x)sta[++top]=x%,x/=;
- while(top)push(sta[top--]^'');
- push('\n');
- }
- void flush(){fwrite(ps,,pp-ps,stdout);}
- namespace poly{
- int g=,iv[N],rev[N],L;
- void init(int l){for(int i=;i<=l;++i)iv[i]=pw(i,mod-);}
- void cls(int*A,int l,int r){for(int i=l;i<r;++i)A[i]=;}
- void cpy(int*A,int*B,int l){for(int i=;i<l;++i)A[i]=B[i];}
- void der(int*A,int l){Run(i,,l-)A[i]=1ll*(i+)*A[i+]%mod;A[l-]=;}
- void dif(int*A,int l){Don(i,l-,)A[i]=1ll*iv[i]*A[i-]%mod;A[]=;}
- void ntt(int*A,int l,int f){
- for(L=;(<<L)<l;++L);
- for(int i=;i<l;++i){
- rev[i]=(rev[i>>]>>)|((i&)<<(L-));
- if(i<rev[i])swap(A[i],A[rev[i]]);
- }
- for(int i=;i<l;i<<=){
- int wn=pw(g,f*(mod-)/(i<<));
- for(int j=;j<l;j+=i<<){
- int w=;
- for(int k=;k<i;++k,w=1ll*w*wn%mod){
- int x=A[j+k],y=1ll*w*A[j+k+i]%mod;
- A[j+k]=(x+y)%mod,A[j+k+i]=(x-y+mod)%mod;
- }
- }
- }
- if(!~f){for(int i=;i<l;++i)A[i]=1ll*A[i]*iv[l]%mod;}
- }
- void inv(int*A,int*B,int l){
- static int t[N];
- if(l==){B[]=pw(A[],mod-);return;}
- int len=l<<;
- inv(A,B,l>>);cls(B,l,len);
- cpy(t,A,l);cls(t,l,len);
- ntt(t,len,);ntt(B,len,);
- for(int i=;i<len;++i)B[i]=1ll*B[i]*(-1ll*t[i]*B[i]%mod+mod)%mod;
- ntt(B,len,-);cls(B,l,len);
- }
- void ln(int*A,int*B,int l){
- static int t[N];
- int len=l<<;
- inv(A,B,l);
- cpy(t,A,l);cls(t,l,len);
- der(t,l);
- ntt(B,len,);ntt(t,len,);
- for(int i=;i<len;++i)B[i]=1ll*B[i]*t[i]%mod;
- ntt(B,len,-);cls(B,l,len);
- dif(B,l);
- }
- void exp(int*A,int*B,int l){
- static int t[N];
- if(l==){B[]=;return;}
- int len=l<<;
- exp(A,B,l>>);cls(B,l,len);
- ln(B,t,l);
- for(int i=;i<l;++i)t[i]=(A[i]-t[i]+mod)%mod;
- t[]++;
- ntt(B,len,);ntt(t,len,);
- for(int i=;i<len;++i)B[i]=1ll*B[i]*t[i]%mod;
- ntt(B,len,-);cls(B,l,len);
- }
- void solve(int*A,int l){
- static int t[N],r[N];
- if(l==){A[]=;return;}
- int len=l<<;
- solve(A,l>>);cls(A,l,len);
- cpy(t,a,l);cls(t,l,len);
- ntt(A,len,);ntt(t,len,);
- for(int i=;i<len;++i){
- int tmp=A[i];
- A[i]=(mod-1ll*iv[]*t[i]%mod*A[i]%mod*A[i]%mod)%mod;
- t[i]=(mod-1ll*t[i]*tmp%mod)%mod;
- }
- ntt(A,len,-);cls(A,l,len);A[]++;
- ntt(t,len,-);cls(t,l,len);dif(t,l);
- exp(t,r,l);inv(r,t,l);
- ntt(A,len,);ntt(r,len,);
- for(int i=;i<len;++i)A[i]=1ll*A[i]*r[i]%mod;
- ntt(A,len,-);cls(A,l,len);
- dif(A,l);
- ntt(A,len,);ntt(t,len,);
- for(int i=;i<len;++i)A[i]=1ll*A[i]*t[i]%mod;
- ntt(A,len,-);cls(A,l,len);
- }
- }
- int main(){
- // freopen("uoj50.in","r",stdin);
- // freopen("uoj50.out","w",stdout);
- scanf("%d%s",&n,s+);
- for(int i=fac[]=;i<=n;++i){
- fac[i]=1ll*fac[i-]*i%mod;
- if(s[i]-'')a[i-]=pw(fac[i-],mod-);
- }
- int len=;for(;len<=n;len<<=);
- poly::init(len<<);
- poly::solve(ans,len);
- for(int i=;i<=n;++i)write(1ll*ans[i]*fac[i]%mod);
- flush();
- return ;
- }
uoj50【UR#3】链式反应的更多相关文章
- 【UOJ#50】【UR #3】链式反应(分治FFT,动态规划)
[UOJ#50][UR #3]链式反应(分治FFT,动态规划) 题面 UOJ 题解 首先把题目意思捋一捋,大概就是有\(n\)个节点的一棵树,父亲的编号大于儿子. 满足一个点的儿子有\(2+c\)个, ...
- 【UR #3】链式反应
http://uoj.ac/problem/50 %炮姐 好博客 树形结构 枚举根节点的儿子是哪两个 然后列出方程: 然后有EGF的影子! 倍增? 泰勒展开可以把未知数从函数里拿出来!并且变成1次项, ...
- [UOJ50]链式反应
这个题意说人话就是:一棵带标号的有根树,编号满足堆性质,根节点有$x$个儿子是叶子($x\in A$),另外的$2$个儿子也是这样的一棵树,求不同的树的个数 设$f_n$为答案,枚举那两棵子树的大小$ ...
- ur c题练习
ur的c果然sxbk啊 ur5:“三个莫比乌斯反演掷地有声"——摘自v(c)f(z)k(y)语录,无删改 ur2:有根树分治裸题,复杂度玄学$O(n\sqrt{n})$. 首先,转化为统计k ...
- db2 with ur
这几天查询DB2数据库,老遇到select * from XXX with ur, 好奇ur是什么作用,现在记录一下. DB2中,共有四种隔离级:RS,RR,CS,UR,DB2提供了这4种不同的保护级 ...
- 【UOJ#33】【UR#2】树上GCD 有根树点分治 + 容斥原理 + 分块
#33. [UR #2]树上GCD 有一棵$n$个结点的有根树$T$.结点编号为$1…n$,其中根结点为$1$. 树上每条边的长度为$1$.我们用$d(x,y)$表示结点$x,y$在树上的距离,$LC ...
- uoj #118. 【UR #8】赴京赶考 水题
#118. [UR #8]赴京赶考 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/118 Description ...
- uoj #31. 【UR #2】猪猪侠再战括号序列 贪心
#31. [UR #2]猪猪侠再战括号序列 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/31 Descript ...
- UR #13 Yist
第一次打UR,打了一个半小时就弃疗了QAQ 这是我唯一一道考试的时候做出来的题目,其他两道连暴力都懒得写了 很容易发现对于每个要删除的点 我们找到左边第一个比他小的不用删除的点,右边第一个比他小的不用 ...
随机推荐
- sqli-labs学习笔记 DAY7
DAY7 sqli-labs阶段总结 基本步骤 判断是否报错 判断闭合符号 判断注入类型 构建payload 手工注入或者编写脚本 基本注入类型 报错型注入 floor公式(结果多出一个1):and ...
- pycharm连接服务器
python其他知识目录 1. pycharm当做xshell等远程工具,远程连接服务器步骤: 2.pycharm结合Linux服务器进行代码学习: 2.2使用pycharm远程在服务器上修改和执行代 ...
- max number of clients reached Redis测试环境报错
现象:测试服务是去redis循环取数据,早上发现服务挂了,手动登陆redis 无法输入命令,报错:max number of clients reached Redis
- 【探路者】Postmortem会议(“事后诸葛亮”会议)
[探路者]Postmortem会议(“事后诸葛亮”会议) 整理:米赫 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的贪吃蛇游戏主要将完成一个 ...
- IDEA下载插件超时的原因
setting中红框的对勾去掉就可以下载插件了
- 冲刺One之站立会议3 /2015-5-16
2015-5-16 今天我们主要完成一部分服务器端的内容,因为只有服务器端完成了主要功能其他的部分才可以测试有没有成功实现目标.具体包括服务器登陆时需要的端口号.启动时间.服务器状态的显示.在线人数等 ...
- 《大象Think in UML》阅读笔记之一
Think in UML这一书以UML为载体,将面向对象的分析设计思想巧妙地融合在建模UML当中,通过一些实例将软件系统的开发过程中的一些知识有机地结合起来.全书共分为四篇:准备篇.基础篇.进阶篇和总 ...
- php之 常用的 流程管理
1.流程管理的用法是什么样的? 2.怎么发起想要的流程? 3.审批的人要是怎么审批通过? 4.流程审核是不是要挨个走过? 一.要有数据库的内容的 肯定会有表的,首先就是用户表了,然后就是流程表,用户编 ...
- mysql hibernate 关于默认值
字段的默认值 写 NOT NULL DEFAULT 0 等等 一直不行, 算了 干脆在创建的时候 在代码set好了 版权声明:本文为博主原创文章,未经博主允许不得转载.
- 剑指offer :从尾到头打印链表
题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: 链表的遍历只能从头向尾进行,要从尾到头输出,考虑用栈.先从头到尾遍历一次链表,同时将值进栈,再清空栈,同时将值 ...