bzoj 4451 : [Cerc2015]Frightful Formula FFT
4451: [Cerc2015]Frightful Formula
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 177 Solved: 57
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
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
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相关推荐
- [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} 同理 ...
- 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_ ...
- 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 ...
- 【bzoj 4451】[Cerc2015]Frightful Formula - 递推
才没有在做cerc2015呢 看到好像不少人这题写fft卡得死死的啊,不如 O(n) O(n) 递推(雾) 首先可以观察出 (i,1) (i,1)这个格子为 x x时对(n,n)(n,n) a,b a ...
- BZOJ4451 [Cerc2015]Frightful Formula 多项式 FFT 递推 组合数学
原文链接http://www.cnblogs.com/zhouzhendong/p/8820963.html 题目传送门 - BZOJ4451 题意 给你一个$n\times n$矩阵的第一行和第一列 ...
- 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 ...
- 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) 于是令 ...
- Frightful Formula Gym - 101480F (待定系数法)
Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...
- P4351-[CERC2015]Frightful Formula【组合数学,MTT】
正题 题目链接:https://www.luogu.com.cn/problem/P4351 题目大意 n∗nn*nn∗n的矩形,给出第一行和第一列的数,剩下的满足Fi,j=a∗Fi,j−1+b∗Fi ...
最新文章
- 从《2018年全球创新指数报告》看中国创新力!
- 操作系统之计算机系统概述:1、操作系统概述(定义、功能、作用)
- Centos7之搜索命令locate
- 温故而知新,8张 Javascript 思维导图助你成长
- KVM virtio bug整理
- python unicode编码转换中文_Python入门高级教程--Python 中文编码
- Kafka从上手到实践 - 庖丁解牛:Producer | 凌云时刻
- KnockoutJS 3.X API 第七章 其他技术(3) 延迟更新
- C# 实现数字转汉字大写
- 【英语语法入门】第44讲 假设(03)与过去事实相反的虚拟语气
- shang*biao
- 路径正确,但是图片加载不出来
- 大数据部门的作用与大数据工程师的工作
- 线程安全的随机数生成
- 线性表的顺序存储结构——顺序表
- 2020 Leetcode 春季赛战队赛 题目汇总
- 管道过滤器和批处理方式
- Java 获取姓氏的笔画数
- 报关员计算机知识,报关员的计算机水平要多少
- KMS服务搭建及客户端命令
热门文章
- Shape Correspondence and Functional Maps
- 百度深度学习图像识别决赛代码分享(OCR)
- matlab要求 基础,Matlab基础考试要求.doc
- python做一副54扑克牌发牌_用Python制作4人扑克牌发牌游戏
- matlab gpu 编程 macOS,MATLAB GPU编程基础
- android 浏览器开技术
- Android 视图(View)概述
- Android 屏幕旋转时保存状态
- opencv获得图片的像素宽度_OpenCV中获取图像某一像素值
- java常见的定时任务