【BZOJ2655】Calc(拉格朗日插值,动态规划)
【BZOJ2655】Calc(多项式插值,动态规划)
题面
题解
考虑如何\(dp\)
设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案。
\(f[i][j]=f[i-1][j-1]*i*j+f[i][j-1]\)
即不考虑选择\(j\),以及当前选择\(j\),那么枚举是哪个数,转移即可。
时间复杂度\(O(An)\)。
碰到这种东西我们直接假装它是一个若干次的多项式。
先假设是个\(n\)次多项式,发现不对,
再试试\(2n\)次多项式,恩,很对,
那么直接拉格朗日插值就好了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 505
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int A,n,m,MOD,f[MAX][MAX<<1];
int fpow(int a,int b)
{
int s=1;
while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}
return s;
}
int Calc(int x)
{
if(x<=m)return f[n][x];
int tmp=1,ret=0,bs=(n&1)?MOD-1:1;
for(int i=1;i<=m;++i)tmp=1ll*tmp*(x-i)%MOD;
for(int i=1;i<=m;++i)tmp=1ll*tmp*fpow(i,MOD-2)%MOD;
for(int i=0;i<=m;++i,bs=MOD-bs)
{
ret=(ret+1ll*bs*f[n][i]%MOD*tmp%MOD)%MOD;
tmp=1ll*tmp*(x-i)%MOD*fpow(x-i-1,MOD-2)%MOD;
tmp=1ll*tmp*(m-i)%MOD*fpow(i+1,MOD-2)%MOD;
}
return ret;
}
int main()
{
A=read();n=read();MOD=read();
m=min(n+n,A);f[0][0]=1;
for(int j=1;j<=m;f[0][j]=1,++j)
for(int i=1;i<=n;++i)
f[i][j]=(f[i][j-1]+1ll*f[i-1][j-1]*i%MOD*j%MOD)%MOD;
printf("%d\n",Calc(A));
return 0;
}
【BZOJ2655】Calc(拉格朗日插值,动态规划)的更多相关文章
- bzoj千题计划269:bzoj2655: calc (拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] * ...
- P4463 [集训队互测2012] calc 拉格朗日插值 dp 多项式分析
LINK:calc 容易得到一个nk的dp做法 同时发现走不通了 此时可以考虑暴力生成函数. 不过化简那套不太熟 且最后需要求多项式幂级数及多项式exp等难写的东西. 这里考虑观察优化dp的做法. 不 ...
- bzoj 2655 calc —— 拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先设 f[i][j] 表示长度为 i 的序列,范围是 1~j 的答案: 则 f[i][ ...
- BZOJ 2655: calc(拉格朗日插值)
传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...
- [BZOJ2655]calc(拉格朗日插值法+DP)
2655: calc Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 428 Solved: 246[Submit][Status][Discuss] ...
- bzoj 2566 calc 拉格朗日插值
calc Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 377 Solved: 226[Submit][Status][Discuss] Descr ...
- bzoj 2655 calc——拉格朗日插值
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先考虑DP.dp[ i ][ j ]表示值域为 i .选 j 个值的答案,则 dp[ ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- 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!. 注意到值域很大,考 ...
随机推荐
- SMR解析
SMR描述 SMR(Shingled Magnetic Recording)叠瓦式磁记录盘是一种采用新型磁存储技术的高容量磁盘.SMR盘将盘片上的数据磁道部分重叠,就像屋顶上的瓦片一样,这种技术被称为 ...
- 05-matplotlib-直方图
import numpy as np import matplotlib.pyplot as plt ''' 由于一系列不等的纵形图组成,表示数据分布的情况 例如:某年级同学的身高分布 需要注意与 柱 ...
- linux下自己安装软件做成命令
安装nodejs,从官网下下来的是一个压缩包,解压下里面有可执行文件.教程上用ln -s [可执行文件的绝对路径] [/usr/local/bin/]建了一个软连接,这样就能直接无视路径,用命令行调用 ...
- JSBridge的原理
前言 参考来源 前人栽树,后台乘凉,本文参考了以下来源 github-WebViewJavascriptBridge JSBridge-Web与Native交互之iOS篇 Ios Android Hy ...
- 阿里云oracle启动失败
1.监听启动失败: 将$ORACLE_HOME/network/admin 中的listener.ora中的主机名改为localhost 2.sqlplus中startup启动失败 ,出现ORA-00 ...
- map的运用
一.map是一种关联容器,支持高效的查找和访问 map中的元素是一些关键字-值(key-value)对: 关键字起索引作用: 值表示与索引相关联的数据. 关联容器中元素是根据关键字存储的,故其不支持位 ...
- 2017年软件工程作业-“Hello World!”团队互评beta版本
A.欢迎来怼——博客园安卓APP(测评人:刘淑霞) 博客地址:http://www.cnblogs.com/liusx0303/p/7905928.html B.Thunder——爱阅app(测评人: ...
- bootstrap table的展开行问题
照着网上与api里说的添加detailView属性设置为true,detailFormatter属性为展开后的内容,但是设置之后发现,在表格每一行最前面是多出一列正常该显示"+"的 ...
- Scrum Meeting 11.08
成员 今日任务 明日计划 用时 徐越 赵庶宏 薄霖 卞忠昊 WebView和JavaScript交互基础 Bitmap(位图)全解析 Part1 3h 武鑫 设计 ...
- 20162314 Experiment 2 - Tree
Experiment report of Besti course:<Program Design & Data Structures> Class: 1623 Student N ...