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;
}
bzoj 4451 : [Cerc2015]Frightful Formula FFT的更多相关文章
- LG4351 [CERC2015]Frightful Formula
Frightful Formula 给你一个\(n\times n\)矩阵的第一行和第一列,其余的数通过如下公式推出: \[f_{i,j}=a\cdot f_{i,j-1}+b\cdot f_{i-1 ...
- 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 ...
- Frightful Formula Gym - 101480F (待定系数法)
Problem F: Frightful Formula \[ Time Limit: 10 s \quad Memory Limit: 512 MiB \] 题意 题意就是存在一个\(n*n\)的矩 ...
- [BZOJ 3456]城市规划(cdq分治+FFT)
[BZOJ 3456]城市规划(cdq分治+FFT) 题面 求有标号n个点无向连通图数目. 分析 设\(f(i)\)表示\(i\)个点组成的无向连通图数量,\(g(i)\)表示\(i\)个点的图的数量 ...
- 【BZOJ】【2179】FFT快速傅里叶
FFT 做的第二道用到FFT的……好吧其实还是模板题-_-b 百度上说好像分治也能做……不过像FFT这种敲模板的还是省事=.= /*********************************** ...
- [BZOJ 4436][Cerc2015]Kernel Knights
[Cerc2015]Kernel Knights Time Limit: 2 Sec Memory Limit: 512 MBSubmit: 5 Solved: 4[Submit][Status][D ...
- BZOJ 4555: [Tjoi2016&Heoi2016]求和 [FFT 组合计数 容斥原理]
4555: [Tjoi2016&Heoi2016]求和 题意:求\[ \sum_{i=0}^n \sum_{j=0}^i S(i,j)\cdot 2^j\cdot j! \\ S是第二类斯特林 ...
- BZOJ 4259: 残缺的字符串 [FFT]
4259: 残缺的字符串 题意:s,t,星号任意字符,匹配方案数 和上题一样 多乘上一个\(a_{j+i}\)就行了 #include <iostream> #include <cs ...
随机推荐
- dvwa学习笔记之xss
反射型Low 直接输入<script>alert(/xss/)</script>就可以发现弹窗Medium 检查源码 可以看到网站对输入字符进行了过滤,尝试双写绕过,构造< ...
- Ubuntu 1804 本地显示远程服务器文件
本地是 Ubuntu 1804 最近想查看服务器上的图片,之前都是scp到本地,感觉太麻烦,于是查到有一种方法,ssh图形界面那种: 1.在File 界面下,左侧文件栏的最后一列有 “+ Other ...
- 将本地开发完的SDK代码上传到SVN上面:an error occurred while contacting the repository The server may be unreachable or the URL may be incorrect
将本地开发完的SDK代码上传到SVN上面:an error occurred while contacting the repository The server may be unreachabl ...
- Final发布中间产物
目录 ❶版本控制 ❷软件功能说明书 ❸WBS ❹PSP 一.版本控制 ①Git地址:https://git.coding.net/tianjiping/Android-tianjiping.git ② ...
- Task 6.4 冲刺Two之站立会议6
今天对视频的画面质量进行了优化,又把所有的界面更换了一些比较美观的图片和背景.使界面看起来更加地合理,易于接受.
- OTCL,面向对象的脚本一
Otcl 简介 面向对象的脚本语言 类变量和类方法 Otcl的基类称为Object(类的名字,不是面向对象中的"对象"),所以的Otcl类都是从Object派送来的. 直接贴代码, ...
- wait 和 sleep 区别
/* wait 和 sleep 区别? 1,wait可以指定时间也可以不指定. sleep必须指定时间. 2,在同步中时,对cpu的执行权和锁的处理不同. wait:释放执行权,释放锁. sleep: ...
- 最新版ABP 动态WebAPI 日期转json带T的解决方案| ABP DateTIme Json format
ABP动态webapi返回的json数据中,日期时间带T还有毫秒数的问题,在以往的版本中可以使用下面方法解决: 在XXXAbpWebApiModule中加上下面的代码: 很老的很老的版本有效: pub ...
- fir.im的高级统计功能
fir.im的高级统计功能,可以根据渠道和活动名称,统计不同渠道和活动带来的下载量.操作步骤如下: 第一步:生成统计链接 点击高级统计,进入统计详情页,然后点击生成统计链接: 设置统计链接的应用版本. ...
- 第九周(11.11-11.17)----Beta版本发布140字评论
1.新蜂组: 俄罗斯方块:项目有良好的用户界面,在原版的基础上可以对用户分数进行排序,增加了显示下一个方块的功能.是个很有趣的小游戏. 2.天天向上组: 连连看:完成了基本功能,增加了消除时和鼠标点击 ...