$(i,1)$对答案的贡献为$l_iC(2n-i-2,n-i)a^{n-1}b^{n-i}$。

$(1,i)$对答案的贡献为$t_iC(2n-i-2,n-i)*a^{n-i}b^{n-1}$。

$(i,j)$的$c$对答案的贡献为$cC(2n-i-j,n-i)a^{n-j}b^{n-i}$。

$c$总的贡献为:

\[\begin{eqnarray*}
&&c\sum_{i=2}^n\sum_{j=2}^nC(2n-i-j,n-i)a^{n-j}b^{n-i}\\
&=&c\sum_{i=2}^n\sum_{j=2}^n(2n-i-j)!\times\frac{a^{n-j}}{(n-j)!}\times\frac{b^{n-i}}{(n-i)!}\\
&=&c\sum_{i=2}^n\sum_{j=2}^n(2n-i-j)!A_jB_i
\end{eqnarray*}\]

\[\begin{eqnarray*}
A_i=\frac{a^{n-i}}{(n-i)!}\\
B_i=\frac{b^{n-i}}{(n-i)!}
\end{eqnarray*}\]

\[\begin{eqnarray*}
ans+=c\sum_{i=4}^{2n}(2n-i)!\sum_{j=0}^i A_{i-j}B{j}
\end{eqnarray*}\]

FFT mod any prime即可。

时间复杂度$O(n\log n)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=524300,P=1000003,M=1000;
int n,a,b,c,i,j,k,pos[N],ans;
int pa[N],pb[N],fac[N],inv[N],A[N],B[N],C[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
namespace FFT{
struct comp{
long double r,i;comp(long double _r=0,long double _i=0){r=_r;i=_i;}
comp operator+(const comp x){return comp(r+x.r,i+x.i);}
comp operator-(const comp x){return comp(r-x.r,i-x.i);}
comp operator*(const comp x){return comp(r*x.r-i*x.i,r*x.i+i*x.r);}
comp conj(){return comp(r,-i);}
}A[N],B[N];
int a0[N],b0[N],a1[N],b1[N];
const long double pi=acos(-1.0);
void FFT(comp a[],int n,int t){
for(int i=1;i<n;i++)if(i<pos[i])swap(a[i],a[pos[i]]);
for(int d=0;(1<<d)<n;d++){
int m=1<<d,m2=m<<1;
long double o=pi*2/m2*t;comp _w(cos(o),sin(o));
for(int i=0;i<n;i+=m2){
comp w(1,0);
for(int j=0;j<m;j++){
comp&A=a[i+j+m],&B=a[i+j],t=w*A;
A=B-t;B=B+t;w=w*_w;
}
}
}
if(t==-1)for(int i=0;i<n;i++)a[i].r/=n;
}
void mul(int*a,int*b,int*c){//c=a*b
int i,j;
for(i=0;i<k;i++)A[i]=comp(a[i],b[i]);
FFT(A,k,1);
for(i=0;i<k;i++){
j=(k-i)&(k-1);
B[i]=(A[i]*A[i]-(A[j]*A[j]).conj())*comp(0,-0.25);
}
FFT(B,k,-1);
for(i=0;i<k;i++)c[i]=((long long)(B[i].r+0.5))%P;
}
//输入两个多项式,求a*b mod P,保存在c中,c不能为a或b
void mulmod(int*a,int*b,int*c){
int i;
for(i=0;i<k;i++)a0[i]=a[i]/M,b0[i]=b[i]/M;
for(mul(a0,b0,a0),i=0;i<k;i++){
c[i]=1LL*a0[i]*M*M%P;
a1[i]=a[i]%M,b1[i]=b[i]%M;
}
for(mul(a1,b1,a1),i=0;i<k;i++){
c[i]=(a1[i]+c[i])%P,a0[i]=(a0[i]+a1[i])%P;
a1[i]=a[i]/M+a[i]%M,b1[i]=b[i]/M+b[i]%M;
}
for(mul(a1,b1,a1),i=0;i<k;i++)c[i]=(1LL*M*(a1[i]-a0[i]+P)+c[i])%P;
}
}
int main(){
read(n),read(a),read(b),read(c);
for(pa[0]=i=1;i<=n;i++)pa[i]=1LL*pa[i-1]*a%P;
for(pb[0]=i=1;i<=n;i++)pb[i]=1LL*pb[i-1]*b%P;
for(fac[0]=i=1;i<=n+n;i++)fac[i]=1LL*fac[i-1]*i%P;
for(inv[0]=inv[1]=1,i=2;i<=n;i++)inv[i]=1LL*(P-inv[P%i])*(P/i)%P;
for(i=1;i<=n;i++)inv[i]=1LL*inv[i]*inv[i-1]%P;
for(i=1;i<=n;i++){
read(j);
if(i>1)ans=(1LL*fac[n+n-i-2]*inv[n-i]%P*pa[n-1]%P*pb[n-i]%P*j+ans)%P;
}
for(i=1;i<=n;i++){
read(j);
if(i>1)ans=(1LL*fac[n+n-i-2]*inv[n-i]%P*pa[n-i]%P*pb[n-1]%P*j+ans)%P;
}
ans=1LL*ans*inv[n-2]%P;
for(k=1;k<=n;k<<=1);k<<=1;
j=__builtin_ctz(k)-1;
for(i=0;i<k;i++)pos[i]=pos[i>>1]>>1|((i&1)<<j);
for(i=2;i<=n;i++)A[i]=1LL*pa[n-i]*inv[n-i]%P;
for(i=2;i<=n;i++)B[i]=1LL*pb[n-i]*inv[n-i]%P;
FFT::mulmod(A,B,C);
for(i=4;i<=n+n;i++)ans=(1LL*C[i]*fac[n+n-i]%P*c+ans)%P;
return printf("%d",ans),0;
}

  

BZOJ4451 : [Cerc2015]Frightful Formula的更多相关文章

  1. BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学

    原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...

  2. bzoj 4451 : [Cerc2015]Frightful Formula FFT

    4451: [Cerc2015]Frightful Formula Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 177  Solved: 57[Sub ...

  3. LG4351 [CERC2015]Frightful Formula

    Frightful Formula 给你一个\(n\times n\)矩阵的第一行和第一列,其余的数通过如下公式推出: \[f_{i,j}=a\cdot f_{i,j-1}+b\cdot f_{i-1 ...

  4. Frightful Formula Gym - 101480F (待定系数法)

    Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...

  5. Gym 101480F Frightful Formula(待定系数)题解

    #include<cmath> #include<set> #include<map> #include<queue> #include<cstd ...

  6. P4351-[CERC2015]Frightful Formula【组合数学,MTT】

    正题 题目链接:https://www.luogu.com.cn/problem/P4351 题目大意 \(n*n\)的矩形,给出第一行和第一列的数,剩下的满足\(F_{i,j}=a*F_{i,j-1 ...

  7. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. Gym - 101480 CERC 15:部分题目题解(队内第N次训练)

    -------------------题目难度较难,但挺有营养的.慢慢补. A .ASCII Addition pro:用一定的形式表示1到9,让你计算加法. sol:模拟. solved by fz ...

随机推荐

  1. VAssistX的VA Snippet Editor的类注释和函数注释

    title:类注释shortcut:=== /******************************************************** [DateTime]:$YEAR$.$M ...

  2. 浅析 - iOS应用程序的生命周期

    1.应用程序的状态 状态如下: Not running  未运行  程序没启动 Inactive          未激活        程序在前台运行,不过没有接收到事件.在没有事件处理情况下程序通 ...

  3. codevs 2530大质数

    链接:http://codevs.cn/problem/1530/ 解题思路: 这个题最关键的剪枝还是 因子小于平方根,但不是像原来那样用. 逆转思维,与其说判断哪些是质数,不如说判断哪些不是质数,更 ...

  4. 与你相遇好幸运,Sails.js自定义数据库名

    在/api/models/下,自定义的.js文件内容 module.exports = { tableName: '自定义的数据库名',  autoCreatedAt: false, //关闭  au ...

  5. Linux性能分析工具的安装和使用

    转自:http://blog.chinaunix.net/uid-26488891-id-3118279.html Normal 0 7.8 磅 0 2 false false false EN-US ...

  6. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. 攻城狮在路上(壹) Hibernate(十)--- 映射值类型集合

    一.映射Set(集):未排序,无重复. 实例代码: <set name="images" table="IMAGES" lazy="true&q ...

  8. golang debug with LiteIDE

    golang 的调试比较麻烦,debug stop into 无法跳转到自己写的代码,但是能够跳转到系统提供的代码. 以下是简单的测试代码: package main import ( "f ...

  9. NS 802.11函数分析(一)

    recv函数有两个作用,不仅是接收其他节点发送的包,而且当节点接收到其他包的时候也会调用recv() 首先给出NS2中recv的源码,和一些注释: void Mac802_11::recv(Packe ...

  10. 制作U盘启动系统盘

    下载ULtraISO,安装之后,先打开一个iso系统文件,然后选中菜单“启动”下的“写入硬盘映像”