4451: [Cerc2015]Frightful Formula

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 177  Solved: 57
[Submit][Status][Discuss]

Description

给你一个n*n矩阵的第一行和第一列,其余的数通过如下公式推出: 
F[i,j]=a*f[i,j-1]+b*f[i-1,j]+c 
求f[n][n]%(10^6+3) 

Input

第一行三个数n,a,b,c 
第二行n个数,第i个表示f[i][1] 
第三行n个数,第i个表示f[1][i] 

Output

仅一个数表示f[n][n]%(10^6+3) 

Sample Input

Sample Input1:
3 0 0 0
0 0 2
0 3 0

Sample Input2:
4 3 5 2
7 1 4 3
7 4 4 8

Sample Output

Sample Output1:
0

Sample Output2:
41817
数据范围:
2<=n<=200000
其余的数大于等于0小于等于10^6

首先这道题每个变量对答案的贡献需要分开考虑。
第一行第i个数贡献为$a[1][i]\times a^{n-i} \times b^{n-1}\times C^{n-i}_{2n-i-2}$
相当于每个点先转到第二列对应点上,然后类似杨辉三角形向右下拓展,乘上对应的a和b。
列同理。
因为每个点会多产生出来一个c,所以还有一部分是c的贡献。
$$c\times \sum^{n}_{i=2} \sum^{n}_{j=2} a^{n-i}b^{n-j}C^{n-i}_{2n-i-j}=c\times \sum^{2n}_{i=4}(2n-i)!\sum_{j=2}^{n} \frac{a^{n-i+j}}{(n-i+j)!}\times \frac{b^{n-j}}{(n-j)!}$$
上FFT.
为了避免掉精度,把每个数拆成$a*1024+b$的两部分别卷积再合起来。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define pi acos(-1)
#define ll long long
#define N 524289
#define NX 200005
using namespace std;
struct E
{double x,y;E (){;}E (double _x,double _y){x=_x,y=_y;}E operator + (const E a){return E(a.x+x,a.y+y);};E operator - (const E a){return E(x-a.x,y-a.y);};E operator * (const E a){return E(x*a.x-y*a.y,x*a.y+y*a.x);};
}a[N],b[N];
int n,R[N];
void FFT(E *a,int f)
{for(int i=0;i<n;i++)if(i<R[i])swap(a[i],a[R[i]]);for(int i=1;i<n;i<<=1){E wn(cos(pi/i),f*sin(pi/i));for(int j=0;j<n;j+=(i<<1)){E w(1,0);for(int k=0;k<i;k++,w=w*wn){E x=a[j+k],y=w*a[j+k+i];a[j+k]=x+y;a[j+k+i]=x-y;}}}if(f==-1)for(int i=0;i<n;i++)a[i].x/=n;return ;
}
const int p = 1000003;
const int M = 1024;
ll pw(ll x,ll y)
{ll lst=1;while(y){if(y&1)lst=lst*x%p;y>>=1;x=x*x%p;  }return lst;
}
int l[NX],r[NX],pwa[NX],pwb[NX],jie[2*NX],ni[NX];
ll A0[N],B0[N],A1[N],B1[N],T1[N],T2[N],T3[N],T4[N];
void mul(ll *ans,ll *a1,ll *b1)
{for(int i=0;i<n;i++)a[i].x=a[i].y=b[i].x=b[i].y=0;for(int i=0;i<n;i++)a[i].x=a1[i];for(int i=0;i<n;i++)b[i].x=b1[i];FFT(a,1);FFT(b,1);for(int i=0;i<n;i++)a[i]=a[i]*b[i];FFT(a,-1);for(int i=0;i<n;i++)ans[i]=((ll)(a[i].x+0.5))%p;return ;
}
int main()
{int tn,ta,tb,tc;scanf("%d%d%d%d",&tn,&ta,&tb,&tc);for(int i=1;i<=tn;i++)scanf("%d",&l[i]);for(int i=1;i<=tn;i++)scanf("%d",&r[i]);jie[0]=1;ni[0]=ni[1]=1;for(int i=1;i<=2*tn;i++)jie[i]=1LL*jie[i-1]*i%p;for(int i=2;i<=tn;i++)ni[i]=(1LL*(-p/i)*ni[p%i]%p+p)%p;for(int i=1;i<=tn;i++)ni[i]=1LL*ni[i]*ni[i-1]%p;pwa[0]=1;pwb[0]=1;for(int i=1;i<=tn;i++)pwa[i]=1LL*pwa[i-1]*ta%p;for(int i=1;i<=tn;i++)pwb[i]=1LL*pwb[i-1]*tb%p;for(int i=1;i<=tn;i++)T1[i]=1LL*pwa[tn-i]*ni[tn-i]%p;for(int i=1;i<=tn;i++)T2[i]=1LL*pwb[tn-i]*ni[tn-i]%p;ll ans=0;for(int i=2;i<=tn;i++)ans+=1LL*r[i]*pwb[tn-1]%p*pwa[tn-i]%p*jie[2*tn-i-2]%p*ni[tn-2]%p*ni[tn-i]%p;for(int i=2;i<=tn;i++)ans+=1LL*l[i]*pwa[tn-1]%p*pwb[tn-i]%p*jie[2*tn-i-2]%p*ni[tn-2]%p*ni[tn-i]%p;int l=0;n=1;while(n<=tn<<1)n<<=1,l++;for(int i=0;i<n;i++)R[i]=(R[i>>1]>>1)|((i&1)<<(l-1));for(int i=2;i<=tn;i++){A0[i]=T1[i]%M;A1[i]=T1[i]/M;B0[i]=T2[i]%M;B1[i]=T2[i]/M;}memset(T1,0,sizeof(T1));memset(T2,0,sizeof(T2));mul(T1,A0,B0);mul(T2,A1,B0);mul(T3,A0,B1);mul(T4,A1,B1);for(int i=0;i<n;i++){T2[i]+=T3[i];(T1[i]+=T2[i]*M%p+T4[i]*M%p*M%p)%=p;}ll tmp=0;for(int i=4;i<=2*tn;i++){tmp+=1LL*jie[2*tn-i]*T1[i]%p;tmp%=p;}tmp=tmp*tc%p;ans=(ans+tmp)%p;printf("%lld\n",ans);return 0;
}

  

转载于:https://www.cnblogs.com/ezyzy/p/6663565.html

bzoj 4451 : [Cerc2015]Frightful Formula FFT相关推荐

  1. [FFT || 递推] BZOJ 4451 [Cerc2015]Frightful Formula

    f1,i f_{1,i} 的贡献是 f1,i∗an−i∗bn−1∗Cn−i2n−i−2 f_{1,i}*a^{n-i}*b^{n-1}*C_{2n-i-2}^{n-i} fi,1 f_{i,1} 同理 ...

  2. BZOJ 4451: [Cerc2015]Frightful Formula

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

  3. bzoj 4451: [Cerc2015]Frightful Formula 数学+排列组合

    题意 给你一个n*n矩阵的第一行和第一列,其余的数通过如下公式推出: F[i,j]=a*f[i,j-1]+b*f[i-1,j]+c 求f[n][n]%(10^6+3) 2<=n<=2000 ...

  4. 【bzoj 4451】[Cerc2015]Frightful Formula - 递推

    才没有在做cerc2015呢 看到好像不少人这题写fft卡得死死的啊,不如 O(n) O(n) 递推(雾) 首先可以观察出 (i,1) (i,1)这个格子为 x x时对(n,n)(n,n) a,b a ...

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

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

  6. BZOJ4451 : [Cerc2015]Frightful Formula

    $(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 ...

  7. CERC2015 Frightful Formula 神奇的模意义下分数

    上网查了下这道题的正解是FFT......然而机智的xushu用待定系数法A了.... f[i,j]+k=a(f[i][j-1]+k)+b(f[i-1,j]+k) 解得 k=c/(a+b-1) 于是令 ...

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

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

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

    正题 题目链接:https://www.luogu.com.cn/problem/P4351 题目大意 n∗nn*nn∗n的矩形,给出第一行和第一列的数,剩下的满足Fi,j=a∗Fi,j−1+b∗Fi ...

最新文章

  1. 从《2018年全球创新指数报告》看中国创新力!
  2. 操作系统之计算机系统概述:1、操作系统概述(定义、功能、作用)
  3. Centos7之搜索命令locate
  4. 温故而知新,8张 Javascript 思维导图助你成长
  5. KVM virtio bug整理
  6. python unicode编码转换中文_Python入门高级教程--Python 中文编码
  7. Kafka从上手到实践 - 庖丁解牛:Producer | 凌云时刻
  8. KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新
  9. C# 实现数字转汉字大写
  10. 【英语语法入门】第44讲 假设(03)与过去事实相反的虚拟语气
  11. shang*biao
  12. 路径正确,但是图片加载不出来
  13. 大数据部门的作用与大数据工程师的工作
  14. 线程安全的随机数生成
  15. 线性表的顺序存储结构——顺序表
  16. 2020 Leetcode 春季赛战队赛 题目汇总
  17. 管道过滤器和批处理方式
  18. Java 获取姓氏的笔画数
  19. 报关员计算机知识,报关员的计算机水平要多少
  20. KMS服务搭建及客户端命令

热门文章

  1. Shape Correspondence and Functional Maps
  2. 百度深度学习图像识别决赛代码分享(OCR)
  3. matlab要求 基础,Matlab基础考试要求.doc
  4. python做一副54扑克牌发牌_用Python制作4人扑克牌发牌游戏
  5. matlab gpu 编程 macOS,MATLAB GPU编程基础
  6. android 浏览器开技术
  7. Android 视图(View)概述
  8. Android 屏幕旋转时保存状态
  9. opencv获得图片的像素宽度_OpenCV中获取图像某一像素值
  10. java常见的定时任务