【BZOJ2655】calc,dp+拉格朗日插值法
来源:互联网 发布:菜鸟网络农村物流加盟 编辑:程序博客网 时间:2024/04/29 19:12
传送门
思路:
好题
这个题目做法非常多,我知道的起码还有倍增法和预处理伯努利数
这里仅说一下我的想法
从原始dp的思路出发
f[i][j]表示i个元素中选取j个的分数
写出dp方程
初始状态
手玩j比较小的情况,容易发现,
那也就是说我们最终的答案
这是个很好的性质,因为我们只用求出
那这个系数怎么求呢?
有一种比较容易想到的方法是求出较小的
但这样的复杂度是
所以我们尝试引入拉格朗日插值法
设
其中
同样是求出
理论复杂度为
但实际上是可以做到
UPD
2017.3.25
刚从Shallwe大爷那里了解到,原来这里的插值是可以做到
不过速度好像并没有提升多少?应该是我常数写挫了
#include<cstdio>#include<iostream>#define LL long longusing namespace std;int A,n,p;int f[1005][505],inv[1005],pre[1005],sub[1005];main(){ f[0][0]=1; scanf("%d%d%d",&A,&n,&p); for (int i=1;i<=min(n<<1,A);++i) for (int j=0;j<=n;++j) if (j) f[i][j]=((LL)f[i-1][j-1]*i%p*j%p+f[i-1][j])%p; else f[i][j]=f[i-1][j]; if (A<=n*2) return printf("%d",f[A][n]),0; LL ans=0,Inv,fac; inv[0]=inv[1]=1; pre[0]=A%p; for (int i=1;i<=n<<1;++i) pre[i]=1LL*pre[i-1]*(A-i)%p; sub[n<<1]=(A-n*2); for (int i=n*2-1;i>=0;--i) sub[i]=1LL*sub[i+1]*(A-i)%p; for (int i=2;i<=n<<1;++i) inv[i]=1LL*(p-p/i)*inv[p%i]%p; for (int i=2;i<=n<<1;++i) inv[i]=1LL*inv[i]*inv[i-1]%p; for (int i=0;i<=n<<1;++i) { if ((n*2-i)&1) Inv=(-1LL)*inv[i]*inv[n*2-i]%p; else Inv=(LL)inv[i]*inv[n*2-i]%p; fac=1; if (i>0) fac=fac*pre[i-1]%p; if (i<n*2) fac=fac*sub[i+1]%p; ans=(ans+fac*f[i][n]%p*Inv%p)%p; } printf("%d\n",(ans+p)%p);}
0 0
- 【BZOJ2655】calc,dp+拉格朗日插值法
- 【XSY2536】【BZOJ2655】calc DP 数学 拉格朗日插值
- [bzoj2655] calc
- [BZOJ2655] calc
- bzoj 2655: calc dp+拉格朗日插值法
- calc
- Calc
- calc()
- [UVA112]树求和(BZOJ2655)
- JZOJ2904 【集训队互测 2012】Calc 用倍增的思路转移dp
- calc.exe
- 10calc
- Calc计算器
- calc常用
- 2506: calc
- 简易calc
- extremedb--calc
- 【BZOJ2506】calc
- RabbitMQ 实战教程(三) 发布/订阅
- Kafka入门:主要配置以及集群搭建
- poj3522(求最大边最小边差值最小的生成树)
- js局部变量与全局变量的
- 深度学习(四十)caffe使用点滴记录
- 【BZOJ2655】calc,dp+拉格朗日插值法
- makefile中目标all与phony用法
- Unknown character set: 'utf8mb4'
- 使用GCD下载图片
- 安装 MongoDB
- IDEA server key
- jsonp实现跨域调用百度地图接口
- 判断浏览器是否支持某css属性
- REST风格的理解