正题

题目链接:https://www.luogu.com.cn/problem/P4351


题目大意

n∗nn*nn∗n的矩形,给出第一行和第一列的数,剩下的满足Fi,j=a∗Fi,j−1+b∗Fi−1,j+cF_{i,j}=a*F_{i,j-1}+b*F_{i-1,j}+cFi,j​=a∗Fi,j−1​+b∗Fi−1,j​+c

求Fn,nF_{n,n}Fn,n​


解题思路

第一眼看以为是水题,因为给出的数字的贡献通过组合数很好算,但是后来发现麻烦的是那个ccc。我们考虑每个格子的ccc产生的贡献。

下面为了方便我们先默认让所有格子横纵坐标减111
对于一个格子(i,j)(i,j)(i,j),通过它的路径有(2n−i−jn−i)\binom{2n-i-j}{n-i}(n−i2n−i−j​)种,然后产生的贡献是an−ibn−ja^{n-i}b^{n-j}an−ibn−j。为了方便我们反过来表示,然后因为第一行第一列没有贡献所以nnn减一。
那么总共的贡献就是∑i=0n∑j=0naibi(i+ji)\sum_{i=0}^n\sum_{j=0}^na^ib^i\binom{i+j}{i}i=0∑n​j=0∑n​aibi(ii+j​)
然后因为有i+ji+ji+j很麻烦,考虑枚举i+ji+ji+j就有
∑i=02n∑j=max{0,i−n}min{i,n}ajbi−j(i+j)!j!(i−j)!\sum_{i=0}^{2n}\sum_{j=max\{0,i-n\}}^{min\{i,n\}}a^jb^{i-j}\frac{(i+j)!}{j!(i-j)!}i=0∑2n​j=max{0,i−n}∑min{i,n}​ajbi−jj!(i−j)!(i+j)!​
把(i+j)!(i+j)!(i+j)!拿出去就是一个卷积的形式了,模数比较丑所以要用MTTMTTMTT来做。(除了MTTMTTMTT部分全部自己推?)。

记得要预处理单位根,不然会被卡精度,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)(常数巨大)

好像有更简单的做法就是用一个xxx满足ax+bx+c=xax+bx+c=xax+bx+c=x的来消掉ccc这个元就可以直接做了,但是我不会。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
const double Pi=acos(-1);
const ll N=2e6+10,P=1e6+3;
ll n,a,b,c,ans,F[N],H[N],G[N];
ll inv[N],fac[N],r[N],apw[N],bpw[N];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll C(ll n,ll m)
{return fac[n]*inv[m]%P*inv[n-m]%P;}
namespace Poly{const ll seq=32768;struct complex{double x,y;complex(double xx=0,double yy=0){x=xx;y=yy;}}A[N],B[N],C[N],D[N],w[N];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 FFT(complex *f,ll n,ll op){for(ll i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(ll p=2;p<=n;p<<=1){ll len=p>>1;for(ll k=0;k<n;k+=p){for(ll i=k;i<k+len;i++){complex tmp=w[n/len*(i-k)];if(op==-1)tmp.y=-tmp.y;complex tt=f[i+len]*tmp;f[i+len]=f[i]-tt;f[i]=f[i]+tt;}}}if(op==-1){for(ll i=0;i<n;i++)f[i].x=fabs(f[i].x/n+0.5);}return;}void MTT(ll *a,ll *b,ll *c,ll n,ll m){ll l=1;while(l<=n+m)l<<=1;for(ll i=0;i<l;i++)r[i]=(r[i>>1]>>1)|((i&1)?(l>>1):0);for (ll k=1;k<l;k<<=1)for (ll i=0;i<k;i++)w[l/k*i]=(complex){cos(i*Pi/k),sin(i*Pi/k)};for(ll i=0;i<n;i++)A[i].x=a[i]/seq,B[i].x=a[i]%seq;for(ll i=0;i<m;i++)C[i].x=b[i]/seq,D[i].x=b[i]%seq;FFT(A,l,1);FFT(B,l,1);FFT(C,l,1);FFT(D,l,1);complex t1,t2;for(ll i=0;i<l;i++){t1=A[i]*C[i];t2=B[i]*D[i];B[i]=A[i]*D[i]+B[i]*C[i];A[i]=t1;C[i]=t2;}FFT(A,l,-1);FFT(B,l,-1);FFT(C,l,-1);for(ll i=0;i<l;i++){c[i]=(c[i]+(ll)(A[i].x)*seq%P*seq%P)%P;c[i]=(c[i]+(ll)(B[i].x)*seq%P)%P;c[i]=(c[i]+(ll)(C[i].x))%P;}return;}
}
void init(){inv[1]=1;apw[0]=bpw[0]=1;for(ll i=1;i<=2*n;i++)apw[i]=apw[i-1]*a%P,bpw[i]=bpw[i-1]*b%P;for(ll i=2;i<=2*n;i++)inv[i]=(P-(P/i)*inv[P%i]%P)%P;inv[0]=fac[0]=1;for(ll i=1;i<=2*n;i++){fac[i]=fac[i-1]*i%P;inv[i]=inv[i-1]*inv[i]%P;}
}
signed main()
{scanf("%lld%lld%lld%lld",&n,&a,&b,&c);init();n--;for(ll i=0;i<=n;i++){ll x;scanf("%lld",&x);if(!i)continue;x=x*bpw[n-i]%P*apw[n]%P;(ans+=x*C(n+n-i-1,n-1)%P)%=P;}for(ll i=0;i<=n;i++){ll x;scanf("%lld",&x);if(!i)continue;x=x*apw[n-i]%P*bpw[n]%P;(ans+=x*C(n+n-i-1,n-1)%P)%=P;}//处理已知数列for(ll i=0;i<n;i++){F[i]=apw[i]*inv[i]%P;H[i]=bpw[i]*inv[i]%P;}Poly::MTT(F,H,G,n,n);for(ll i=0;i<2*n-1;i++)(ans+=G[i]*c%P*fac[i]%P)%=P;
//    for(ll i=0;i<=n;i++){//        (ans+=P-apw[n-i]*bpw[n]%P*c%P*C(n+n-i,n)%P)%=P;
//      if(!i)continue;
//        (ans+=P-bpw[n-i]*apw[n]%P*c%P*C(n+n-i,n)%P)%=P;
//    }printf("%lld\n",ans);return 0;
}

P4351-[CERC2015]Frightful Formula【组合数学,MTT】相关推荐

  1. bzoj 4451 : [Cerc2015]Frightful Formula FFT

    4451: [Cerc2015]Frightful Formula Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 177  Solved: 57 [S ...

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

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

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

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

  4. 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_ ...

  5. 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 ...

  6. 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) 于是令 ...

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

  8. [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} 同理 ...

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

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

最新文章

  1. TVM 高效保护隐私 ML
  2. 向海龙回应“被百度开除”:离开是为了专心做投资
  3. 嵌入式学习笔记——SPI协议
  4. debugger markup language帮助文档(DML)
  5. Ubuntu下安装中文输入法(本文安装的搜狗输入法)
  6. Python Django Q查询和F查询API
  7. python gridsearch_python gridsearch中的内存错误
  8. Java讲课笔记33:多线程概述与线程创建
  9. java用什么编辑器比较好_强大又好用的一款微信排版工具:135编辑器
  10. 2018-2019-1 20189221 《构建之法》第 3 周学习总结
  11. 我也是不得不说我的学习能力下降了,这两天都没有完成一个模块
  12. 最近amd.dll闹的很火
  13. 噪音测试软件+安卓,分贝噪音测试软件
  14. Winserver普通域用户账户无权限启动停止系统服务(启动停止按钮是灰色)
  15. Maven项目快速打包
  16. ICP算法学习笔记(原理加公式理解)
  17. 投资的收益与风险的数学建模
  18. Python数据分析项目-微信好友数据分析
  19. 教你制作漂亮的Word项目符号。
  20. 高等数学:一元函数微分学

热门文章

  1. okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
  2. android菜单和对话栏,Android回顾--(十一) 菜单和对话框
  3. linux宝塔类似工具,有没有比宝塔面板更好的linux运维工具?
  4. jodconverter水印java,OpenOffice实现Office转Pdf(支持自定义添加水印、页眉、页脚)
  5. 每天一小时python官方文档学习(一)————python的简单介绍
  6. 详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
  7. Java源文件声明规则
  8. [JavaWeb-HTTP]request对象和response对象的原理
  9. C++ 多态实现的三个条件
  10. [剑指offer]面试题48:不能被继承的类