BZOJ2655: calc(dp 拉格朗日插值)
题意
Sol
首先不难想到一个dp
设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数
转移的时候判断一下最后一个位置是否是\(j\)
\]
for(int i = 0; i <= A; i++) f[0][i] = 1;
for(int i = 1; i <= N; i++)
for(int j = 1; j <= A; j++)
f[i][j] = add(f[i][j - 1], mul(f[i - 1][j - 1], j));
cout << mul(f[N][A], fac[N]);
发现还是不好搞,把转移拆开
\(f[i][j] = \sum_{k = 0}^{j - 1} f[i - 1][k] * (k + 1)\)
这个转移就非常有意思了
我们如果把\(i\)看成列,\(k\)看成行,那么转移的时候实际上就是先对第\(k\)行乘上一个系数\(k\),然后再求和
如果我们把第\(i - 1\)列看成一个\(t\)次多项式,显然第\(i\)列是一个\(t+2\)次多项式(求和算一次,乘系数算一次)
这样的话第\(i\)列就是一个最高\(2i+1\)次多项式
插一插就好了
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 10001;
int A, N, Lim, mod, f[501][MAXN], fac[MAXN], y[MAXN];
int add(int x, int y) {
if(x + y < 0) return x + y + mod;
return x + y >= mod ? x + y - mod : x + y;
}
void add2(int &x, int y) {
if(x + y < 0) x = (x + y + mod);
else x = (x + y >= mod ? x + y - mod : x + y);
}
int mul(int x, int y) {
return 1ll * x * y % mod;
}
int fp(int a, int p) {
int base = 1;
while(p) {
if(p & 1) base = mul(base, a);
a = mul(a, a); p >>= 1;
}
return base;
}
int Large(int *y, int k) {
static int x[MAXN], ans = 0;
for(int i = 1; i <= Lim; i++) x[i] = i;
for(int i = 0; i <= Lim; i++) {
int up = y[i], down = 1;
for(int j = 0; j <= Lim; j++) {
if(i == j) continue;
up = mul(up, add(k, -x[j]));
down = mul(down, add(x[i], -x[j]));
}
add2(ans, mul(up, fp(down, mod - 2)));
}
return ans;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("a.in", "r", stdin);
// freopen("a.out", "w", stdout);
#endif
cin >> A >> N >> mod; Lim = 2 * N + 1;
fac[0] = 1; for(int i = 1; i <= N; i++) fac[i] = mul(i, fac[i - 1]);
for(int i = 0; i <= Lim; i++) f[0][i] = 1;
for(int i = 1; i <= N; i++) {
for(int j = 1; j <= Lim; j++) {
f[i][j] = add(f[i][j - 1], mul(f[i - 1][j - 1], j));
}
}
for(int i = 0; i <= Lim; i++) y[i] = f[N][i];
cout << mul(Large(y, A), fac[N]);
return 0;
}
BZOJ2655: calc(dp 拉格朗日插值)的更多相关文章
- BZOJ2655 Calc - dp 拉格朗日插值法
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...
- 【BZOJ2655】Calc(拉格朗日插值,动态规划)
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...
- 【BZOJ2655】calc(拉格朗日插值)
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- BZOJ4599[JLoi2016&LNoi2016]成绩比较(dp+拉格朗日插值)
这个题我们首先可以dp,f[i][j]表示前i个科目恰好碾压了j个人的方案数,然后进行转移.我们先不考虑每个人的分数,先只关心和B的相对大小关系.我们设R[i]为第i科比B分数少的人数,则有f[i][ ...
- bzoj 4559 [JLoi2016]成绩比较 —— DP+拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4559 看了看拉格朗日插值:http://www.cnblogs.com/ECJTUACM-8 ...
- P4463 [国家集训队] calc(拉格朗日插值)
传送门 设\(dp[i][j]\)为考虑\(i\)个数,其中最大值不超过\(j\)的答案,那么转移为\[dp[i][j]=dp[i-1][j-1]\times i\times j+dp[i][j-1] ...
- 【bzoj4559】[JLoi2016]成绩比较(dp+拉格朗日插值)
bzoj 题意: 有\(n\)位同学,\(m\)门课. 一位同学在第\(i\)门课上面获得的分数上限为\(u_i\). 定义同学\(A\)碾压同学\(B\)为每一课\(A\)同学的成绩都不低于\(B\ ...
- F. Cowmpany Cowmpensation dp+拉格朗日插值
题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项, ...
随机推荐
- CSS揭秘—多重边框(二)
前言: 所有实例均来自<CSS揭秘>,该书以平时遇到的疑难杂症为引,提供解决方法,只能说秒极了,再一次刷新了我对CSS的认知 该书只提供了关键CSS代码,虽然有在线示例代码链接,但访问速度 ...
- 音频处理库—librosa的安装与使用
序言 Librosa是一个用于音频.音乐分析.处理的python工具包,一些常见的时频处理.特征提取.绘制声音图形等功能应有尽有,功能十分强大.本文主要介绍librosa的安装与使用方法. 一.lib ...
- pylot测试工具环境搭建
1.下载Pylot:www.pylot.org/ 2. 安装Python 2.5 + (必须) 3. 安装wxPython(可选 - 用于GUI模式) 4. 安装numpy的(可选 - 用于报告以图表 ...
- poj1001
#include <iostream> #include<iomanip> #include<cstring> using namespace std; int s ...
- mycat 从入门到放弃 (转)
http://blog.csdn.net/u013235478/article/details/53178657 1.非分片字段查询 Mycat中的路由结果是通过分片字段和分片方法来确定的.例如下 ...
- linux 命令 — archive
tar 一般用法 tar -cf out.tar [files] tar -cf out.tar file1 file2 -c :创建文件 -f:指定创建的文件名称,-f必须是所有参数的最后一项,比如 ...
- VisualVM远程连接Tomcat
最近项目已经要提测了,有时间来考虑一些性能上的事儿了.之前拜读过<深入理解java虚拟机>,只可惜当时功力尚浅,有些东西还是不太懂,而且应用场景也没有,所以借这次机会看看.当然了,这次并不 ...
- Win32知识之窗口绘制.窗口第一讲
Win32知识之窗口本质 一丶摘要 在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 窗口的本质是不断绘制.是windows通过消息机制进行绘制的. 我们知道. ...
- Java 锁优化
一.重量级锁 Java中,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的.而操作系统实现 ...
- MySQL模糊匹配查询like、regexp、in
MySQL提供标准的SQL模式匹配,以及一种基于像Unix实用程序,如:vi.grep和sed的扩展正则表达式模式匹配的格式 一.SQL模式(% ,_) SQL的模式匹配允许你使用“_”匹配任何单个字 ...