BZOJ2655 calc
拉格朗日插值+dp
直接dp是n立方的,我们考虑优化。
dp式子为f[i][j]=f[i-1][j-1]*j*i+f[i-1][j]表示i个元素选j个的答案
然后发现最高次就是2j次,所以我们预处理出2n个点的值再用拉格朗日一插就好。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int A,n,mod;
int qmod(int a,int b)
{
int ans=;
while(b)
{
if(b&)ans=1ll*ans*a%mod;
b>>=;a=1ll*a*a%mod;
}
return ans;
}
ll f[][],inv[],las[],fac[],pre[],ans;
int main()
{
scanf("%d%d%d",&A,&n,&mod);
f[][]=;
for(int i=;i<=min(n*,A);++i)
for(int j=;j<=n;++j)
if(j)f[i][j]=(1ll*i%mod*j%mod*f[i-][j-]%mod+f[i-][j])%mod;
else f[i][j]=f[i-][j];
if(A<=n*){
printf("%d\n",f[A][n]);
return ;
}
inv[]=inv[]=fac[]=inv[]=;
pre[]=A%mod;
for(int i=;i<=n*;++i)
{
pre[i]=pre[i-]*(A-i)%mod;
fac[i]=fac[i-]*i%mod;
}
las[n*]=(A-n*)%mod;inv[n*]=qmod(fac[n*],mod-);
for(int i=n*-;i>=;--i)las[i]=las[i+]*(A-i+mod)%mod;
for(int i=n*-;i>=;--i)inv[i]=inv[i+]*(i+)%mod;
for(int i=;i<=n*;++i)
{
ll INV,FAC=;
if((n*-i)&)INV=-1ll*inv[i]*inv[n*-i]%mod;
else INV=1ll*inv[i]*inv[n*-i]%mod;
if(i>)FAC=pre[i-]%mod;
if(i<n*)FAC=FAC*las[i+]%mod;
ans=(ans+FAC*f[i][n]%mod*INV%mod)%mod;
}
printf("%lld\n",(ans+mod)%mod);
return ;
}
BZOJ2655 calc的更多相关文章
- BZOJ2655 Calc - dp 拉格朗日插值法
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...
- [BZOJ2655]calc(拉格朗日插值法+DP)
2655: calc Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 428 Solved: 246[Submit][Status][Discuss] ...
- BZOJ2655 calc(动态规划+拉格朗日插值法)
考虑暴力dp:f[i][j]表示i个数值域1~j时的答案.考虑使其值域++,则有f[i][j]=f[i][j-1]+f[i-1][j-1]*i*j,边界f[i][i]=i!*i!. 注意到值域很大,考 ...
- BZOJ2655: calc(dp 拉格朗日插值)
题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...
- 2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)
传送门 题意简述:问有多少数列满足如下条件: 所有数在[1,A][1,A][1,A]之间. 没有相同的数 数列长度为nnn 一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和. A≤1e9,n ...
- bzoj千题计划269:bzoj2655: calc (拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] * ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
- 【BZOJ2655】Calc(拉格朗日插值,动态规划)
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...
- 【BZOJ2655】calc(拉格朗日插值)
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...
随机推荐
- d3浅谈
d3是一个及其庞大的库,有20个模块,大小也达到了216kb,是JQ1.x的2倍多,JQ3.x的3倍多,JQ本来就挺笨重的一个库,d3更是如此,但是它的功能确实很强悍~ d3的定位是一个科学计算库,并 ...
- angularJs的各种服务和指令的使用场景
$location服务,获取页面跳转带的参数 比如说页面是这样的 localhost:9102/admin/goods.html#?id=123 如何获取这个id=123的值呢?????(注意: ...
- Redis记录-Redis介绍
Redis是一个开源,高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的Web应用程序. Redis有三个主要特点,使它优越于其它键值数据存储系统 - Redis将其数据库完全保存在内存中, ...
- 用代码块在new对象时set属性
看到这样一种用法,很方便 request.setRequestHead(new RequestHeadType() {{ setRequestor("Online"); setRe ...
- Docker 入门 第一部分: 定位和设置
目录 Docker 入门 第一部分: 定位和设置 Docker概念 镜像和容器 容器和虚拟机 准备你的Docker环境 测试 Docker 的版本 测试 Docker 安装 回顾 总结 Docker ...
- THINKPHP中使用swoole
首先,运行swoole服务端程序要在命令行模式下运行php文件,所以thinkphp要设置成命令行模式运行,在入口文件中增加一个配置即可: define(‘MODE_NAME’,‘cli’); 然后运 ...
- Web性能优化系列(1):Web性能优化分析
本文由 伯乐在线 - 鸭梨山大 翻译,sunbiaobiao 校稿.未经许可,禁止转载!英文出处:gokulkrishh.github.io.欢迎加入翻译小组. 如果你的网站在1000ms内加载完成, ...
- Mybatis逆向工程——(十四)
逆向工程可以快速将数据库的表生成JavaBean,同时生成对单标操作的Mapper.java与Mapper.xml,极大地提高了开发速度. 1.jar包
- mysql区间范围查询问题
一,日期区间查询,表里有一个时间字段 最常见的就是某时间段查询,比如xxxx时间---xxxx时间有多少条数据.例如数据库里的字段是 income_period, 该字段类型可以是字符串(varcha ...
- Linux ALSA声卡驱动之五:移动设备中的ALSA(ASoC)
转自http://blog.csdn.net/droidphone/article/details/7165482 1. ASoC的由来 ASoC--ALSA System on Chip ,是建立 ...