[xsy1140]求值
$\newcommand{ali}[1]{\begin{align*}#1\end{align*}}$题意:给定$n,b,c,d,e,a_{0\cdots n-1}$,令$x_k=bc^{4k}+dc^{2k}+e$,$f(x)=\sum\limits_{i=0}^{n-1}a_ix^i$,求$f(x_{0\cdots n-1})$
如果单纯看推公式的话,这题没什么思维含量,但对各种卷积的处理还是需要一定的思考的
1.$c=0$,此时$x_0=b+d+e$,$x_{1\cdots n-1}=e$,直接算即可
2.$b=0$,我们来推导一番
$\ali{f(x_k)&=\sum\limits_{i=0}^{n-1}a_i(dc^{2k}+e)^i\\&=\sum\limits_{i=0}^{n-1}a_i\sum\limits_{j=0}^i\binom ijd^jc^{2kj}e^{i-j}\\&=\sum\limits_{j=0}^{n-1}\dfrac{d^jc^{2kj}}{j!}\sum\limits_{i=j}^{n-1}\dfrac{a_ii!e^{i-j}}{(i-j)!}}$
令$p_j=\sum\limits_{i=j}^{n-1}\frac{a_ii!e^{i-j}}{(i-j)!}$,这是$a_ii!(i=n-1\cdots0)$卷$\frac{e^i}{i!}(i=0\cdots n-1)$的$n-1-j$项
$\ali{\sum\limits_{j=0}^{n-1}\dfrac{d^jc^{2kj}p_j}{j!}&=c^{k^2}\sum\limits_{j=0}^{n-1}\dfrac{c^{-(k-j)^2}c^{j^2}d^jp_j}{j!}\\&=c^{k^2}\left(\sum\limits_{j=0}^k\dfrac{c^{-(k-j)^2}c^{j^2}d^jp_j}{j!}+\sum\limits_{j=k+1}^{n-1}\dfrac{c^{-(j-k)^2}c^{j^2}d^jp_j}{j!}\right)}$
第一个sigma是$c^{-i^2}(i=0\cdots n-1)$卷$\frac{c^{i^2}d^ip_i}{i!}(i=0\cdots n-1)$的$k$项,第二个sigma是$\frac{c^{i^2}d^ip_i}{i!}(i=n-1\cdots1)$卷$c^{-i^2}(i=1\cdots n-1)$的$n-2-k$项
3.一般情况
我们先配方,$bc^{4k}+dc^{2k}+e=b\left(c^{2k}+\frac d{2b}\right)^2+e-\frac{d^2}{4b}$,重新定义$d=\frac d{2b},e=e-\frac{d^2}{4b}$,于是$x_k=b(c^{2k}+d)^2+e$
$\ali{f(x_k)&=\sum\limits_{i=0}^{n-1}a_i\left[b\left(c^{2k}+d\right)^2+e\right]^2\\&=\sum\limits_{i=0}^{n-1}a_i\sum\limits_{j=i}^{n-1}\binom ijb^j\left(c^{2k}+d\right)^{2j}e^{i-j}\\&=\sum\limits_{j=0}^{n-1}\dfrac{b^j\left(c^{2k}+d\right)^{2j}p_j}{j!}\\&=\sum\limits_{j=0}^{n-1}\dfrac{b^jp_j}{j!}\sum\limits_{l=0}^{2j}\binom{2j}lc^{2kl}d^{2j-l}\\&=\sum\limits_{l=0}^{2n-2}\dfrac{c^{2kl}}{l!}\sum\limits_{j=\left\lceil\frac l2\right\rceil}^{n-1}\dfrac{(2j)!d^{2j-l}b^jp_j}{j!(2j-l)!}}$
令$q_l=\sum\limits_{j=\left\lceil\frac l2\right\rceil}^{n-1}\frac{(2j)!d^{2j-l}b^jp_j}{j!(2j-l)!}$,下面分别对$l$为奇数和偶数的情况分开讨论,因为式子中偏移$-l$的项含$2j$,所以推式子的时候要适当换元$t=2j$
$l$为奇数,是$\frac{(2i)!b^ip_i}{i!}(i=n-1\cdots1)$卷$\frac{d^{2i-1}}{(2i-1)!}(i=1\cdots n-1)$的$n-1-\frac{l+1}2$项
$l$为偶数,是$\frac{(2i)!b^ip_i}{i!}(i=n-1\cdots0)$卷$\frac{d^{2i}}{(2i)!}(i=0\cdots n-1)$的$n-1-\frac l2$项
$\ali{\sum\limits_{l=0}^{2n-2}\dfrac{c^{2kl}q_l}{l!}&=c^{k^2}\sum\limits_{l=0}^{2n-2}\dfrac{c^{-(k-l)^2}c^{l^2}q_l}{l!}\\&=c^{k^2}\left(\sum\limits_{l=0}^k\dfrac{c^{-(k-l)^2}c^{l^2}q_l}{l!}+\sum\limits_{l=k+1}^{2n-2}\dfrac{c^{-(l-k)^2}c^{l^2}q_l}{l!}\right)}$
第一个sigma是$c^{-i^2}(i=0\cdots n-1)$卷$\frac{c^{i^2}q_i}{i!}(i=0\cdots n-1)$的$k$项,第二个sigma是$\frac{c^{i^2}q_i}{i!}(i=2n-2\cdots1)$卷$c^{-i^2}(i=1\cdots2n-2)$的$2n-3-k$项
然后就做完了,感觉略毒...
#include<stdio.h>
#include<string.h>
#include<math.h>
typedef long long ll;
const int mod=1000003,maxn=524288;
typedef double du;
int mul(int a,int b){return a*(ll)b%mod;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
int pow(int a,ll b){
int s=1;
while(b){
if(b&1)s=mul(s,a);
a=mul(a,a);
b>>=1;
}
return s;
}
struct complex{
du x,y;
complex(du a=0,du b=0){x=a;y=b;}
};
complex operator+(complex a,complex b){return complex(a.x+b.x,a.y+b.y);}
complex operator-(complex a,complex b){return complex(a.x-b.x,a.y-b.y);}
complex operator*(complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
void swap(complex&a,complex&b){
complex c=a;
a=b;
b=c;
}
int rev[maxn],N;
complex w[19][maxn];
void pre(int n){
int i,j,k;
for(N=1,k=0;N<n;N<<=1)k++;
for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
k=0;
for(i=2;i<=N;i<<=1){
for(j=0;j<i;j++)w[k][j]=complex(cos(j*M_PI/(i/2)),sin(j*M_PI/(i/2)));
k++;
}
}
void fft(complex*a,int on){
int i,j,k,f;
complex t;
for(i=0;i<N;i++){
if(i<rev[i])swap(a[i],a[rev[i]]);
}
f=0;
for(i=2;i<=N;i<<=1){
for(j=0;j<N;j+=i){
for(k=0;k<i>>1;k++){
t=w[f][k];
if(on==-1)t.y=-t.y;
t=t*a[i/2+j+k];
a[i/2+j+k]=a[j+k]-t;
a[j+k]=a[j+k]+t;
}
}
f++;
}
if(on==-1){
for(i=0;i<N;i++)a[i].x/=N;
}
}
complex A[maxn],B[maxn],C[maxn],D[maxn];
void conv(int*a,int*b,int*c){
int i;
complex t;
for(i=0;i<N;i++){
A[i]=a[i]>>10;
B[i]=a[i]&1023;
C[i]=b[i]>>10;
D[i]=b[i]&1023;
}
fft(A,1);
fft(B,1);
fft(C,1);
fft(D,1);
for(i=0;i<N;i++){
t=A[i]*D[i]+B[i]*C[i];
A[i]=A[i]*C[i];
C[i]=B[i]*D[i];
B[i]=t;
}
fft(A,-1);
fft(B,-1);
fft(C,-1);
for(i=0;i<N;i++)c[i]=((llround(A[i].x)%mod<<20)+(llround(B[i].x)%mod<<10)+llround(C[i].x)%mod)%mod;
}
int a[maxn],t1[maxn],t2[maxn],t3[maxn],fac[maxn],rfac[maxn],p[maxn],s[maxn],f1[maxn],f2[maxn],n,b,c,d,e;
namespace c0{
int get(int x){
int s,t,i;
s=0;
t=1;
for(i=0;i<n;i++){
s=ad(s,mul(t,a[i]));
t=mul(t,x);
}
return ad(s,mod);
}
void solve(){
int i,s1,s2;
s1=get(b+d+e);
s2=get(e);
printf("%d\n",s1);
for(i=1;i<n;i++)printf("%d\n",s2);
}
}
namespace b0{
void solve(){
int i,t,u,v,w;
t=1;
for(i=0;i<n;i++){
t1[n-1-i]=mul(a[i],fac[i]);
t2[i]=mul(t,rfac[i]);
t=mul(t,e);
}
conv(t1,t2,t3);
for(i=0;i<n;i++)p[i]=t3[n-1-i];
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
t=pow(c,mod-2);
u=1;
v=1;
w=1;
for(i=0;i<n;i++){
t1[i]=u;
t2[i]=mul(mul(v,w),mul(p[i],rfac[i]));
u=mul(u,pow(t,i*2+1));
v=mul(v,pow(c,i*2+1));
w=mul(w,d);
}
conv(t1,t2,t3);
for(i=0;i<n;i++)f1[i]=t3[i];
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
u=t;
v=c;
w=d;
for(i=1;i<n;i++){
t1[n-1-i]=mul(mul(v,w),mul(p[i],rfac[i]));
t2[i-1]=u;
u=mul(u,pow(t,i*2+1));
v=mul(v,pow(c,i*2+1));
w=mul(w,d);
}
conv(t1,t2,t3);
for(i=0;i<n;i++)f2[i]=t3[n-2-i];
u=1;
for(i=0;i<n;i++){
s[i]=mul(u,ad(f1[i],f2[i]));
u=mul(u,pow(c,i*2+1));
}
for(i=0;i<n;i++)printf("%d\n",ad(s[i],mod));
}
}
namespace def{
int q[maxn];
void solve(){
int i,t,u,v;
u=mul(d,pow(2*b%mod,mod-2));
v=de(e,mul(mul(d,d),pow(4*b%mod,mod-2)));
d=u;
e=v;
t=1;
for(i=0;i<n;i++){
t1[n-1-i]=mul(a[i],fac[i]);
t2[i]=mul(t,rfac[i]);
t=mul(t,e);
}
conv(t1,t2,t3);
for(i=0;i<n;i++)p[i]=t3[n-1-i];
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
t=1;
u=d;
for(i=1;i<n;i++){
t=mul(t,b);
t1[n-1-i]=mul(mul(fac[i*2],mul(t,p[i])),rfac[i]);
t2[i-1]=mul(u,rfac[2*i-1]);
u=mul(u,mul(d,d));
}
conv(t1,t2,t3);
for(i=1;i<=2*n-2;i+=2)q[i]=t3[n-1-(i+1)/2];
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
t=1;
u=1;
for(i=0;i<n;i++){
t1[n-1-i]=mul(mul(fac[i*2],mul(t,p[i])),rfac[i]);
t2[i]=mul(u,rfac[2*i]);
t=mul(t,b);
u=mul(u,mul(d,d));
}
conv(t1,t2,t3);
for(i=0;i<=2*n-2;i+=2)q[i]=t3[n-1-i/2];
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
t=pow(c,mod-2);
u=1;
v=1;
for(i=0;i<n;i++){
t1[i]=u;
t2[i]=mul(mul(v,q[i]),rfac[i]);
u=mul(u,pow(t,i*2+1));
v=mul(v,pow(c,i*2+1));
}
conv(t1,t2,t3);
for(i=0;i<n;i++)f1[i]=t3[i];
memset(t1,0,sizeof(t1));
memset(t2,0,sizeof(t2));
u=t;
v=c;
for(i=1;i<=2*n-2;i++){
t1[2*n-2-i]=mul(mul(v,q[i]),rfac[i]);
t2[i-1]=u;
u=mul(u,pow(t,i*2+1));
v=mul(v,pow(c,i*2+1));
}
pre(n<<2);
conv(t1,t2,t3);
for(i=0;i<n;i++)f2[i]=t3[2*n-3-i];
u=1;
for(i=0;i<n;i++){
s[i]=mul(u,ad(f1[i],f2[i]));
u=mul(u,pow(c,2*i+1));
}
for(i=0;i<n;i++)printf("%d\n",ad(s[i],mod));
}
}
int main(){
int i;
scanf("%d%d%d%d%d",&n,&b,&c,&d,&e);
for(i=0;i<n;i++)scanf("%d",a+i);
pre(n<<1);
fac[0]=1;
for(i=1;i<N;i++)fac[i]=mul(fac[i-1],i);
rfac[N-1]=pow(fac[N-1],mod-2);
for(i=N-1;i>0;i--)rfac[i-1]=mul(rfac[i],i);
if(c==0)
c0::solve();
else if(b==0)
b0::solve();
else
def::solve();
}
[xsy1140]求值的更多相关文章
- 延迟求值-如何让Lo-Dash再提速x100?
「注释」作者在本文里没有说明这么一个事实: 目前的版本Lo-Dash v2.4.1并没有引入延迟求值的特性,Lo-Dash 3.0.0-pre中部分方法进行了引入,比如filter(),map(),r ...
- python迭代器实现斐波拉契求值
斐波那契数列(Fibonacci sequence),又称黄金分割数列,也称为"兔子数列":F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*).例 ...
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- Java 计算数学表达式(字符串解析求值工具)
Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calc ...
- 诡异的C语言实参求值顺序
学了这么久的C语言,竟然第一次碰到这么诡异的实参求值顺序问题,大跌眼镜.果然阅读面太少了! #include<iostream> void foo(int a, int b, int c) ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- [C] 关于表达式求值
结论是:在一个表达式中,如果两个相邻操作符的执行顺序由它们的优先级决定,如果它们的优先级相同,它们的执行顺序由它们的结合性决定.若出现前述规则描述之外的情形,编译器可以自由决定求值的顺序(只要不违反逗 ...
- 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
1,表达式的求值顺序与堆栈结构 “表达式” 是程序语言一个很重要的术语,也是大家天天写的程序中很常见的东西,但是表达式的求值顺序一定是从左到右么? C/C++语言中没有明确规定表达式的运算顺序(从左到 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
随机推荐
- Educational Codeforces Round 55 (Rated for Div. 2):C. Multi-Subject Competition
C. Multi-Subject Competition 题目链接:https://codeforces.com/contest/1082/problem/C 题意: 给出n个信息,每个信息包含专业编 ...
- POJ3349 Snowflake Snow Snowflakes (hash
Snowflake Snow Snowflakes Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 48624 Accep ...
- mysql的对象
mysql 常见的数据对象有哪些: DataBase/Schema Table Index View/Trigger/Function/Procedure 多Database用途: 业务的隔离 ...
- JavaScript 被忽视的细节
语句/表达式 换个角度理解语句(statemaents)和表达式(expressions):表达式不会改变程序的运行状态,而语句会.还有一种叫做表达式语句,可以理解为表达式和语句的交集,如({a:1} ...
- LVS+Keepalived搭建MyCAT高可用負載均衡集群
1.前面我们已经搭建好mysql主主,并且用mycat实现双写功能,主要配置文件: [root@mycat2 conf]# cat schema.xml <?xml version=" ...
- PHP等比例生成缩略图
/** * 生成缩略图 * $imgSrc 图片源路径 * $resize_width 图片宽度 * $resize_height 图片高度 * $dstimg 缩略图路径 * $isCut 是否剪切 ...
- js错误处理
导致程序无法继续执行的异常状态称为错误. js中一旦发生错误,就会自动创建一个Error类型对象 js中有6中错误类型: SyntaxError 语法错误 ReferenceError 引用错误,找不 ...
- 51nod 扔盘子
题目传送门 这道题一开始写了n方的算法 果不其然 它T了 所以就想想o(n)的算法 写不出来 就像sbzhq学习了一下 这道题啊 要维护一下从深度1到n每一段的最小值以及他的位置 然后就暴力搞一搞就o ...
- POJ2479(最长连续子序列和)
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37035 Accepted: 11551 Des ...
- 【转】Linux Futex的设计与实现
引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序" ...