WJMZBMR的题果然放在几年后看来仍然挺神,提出了一种独特的优化DP的方式

首先我们想一个暴力DP,先定下所有数的顺序(比如强制它递增),然后最后乘上\(n!\)种排列方式就是答案了

那么我们容易想出一个DP,令\(f_{i,j}\)表示前\(i\)个数中,最大的数小于等于\(j\)的方案数是多少

显然有转移:

\[f_{i,j}=f_{i-1,j-1}\times j+f_{i,j-1}
\]

但这样DP是\(O(nA)\)的,需要用拉格朗日插值进行优化,不会拉格朗日插值的可以看一下浅谈拉格朗日插值

在里面就提到了插值的一个关键点就是求出给定多项式的次数。因此我们观察\(f_{n,i}\),猜测它是关于\(i\)的\(t_n\)次多项式

那么我们把转移方程移项一下:

\[f_{i,j}-f_{i,j-1}=f_{i-1,j-1}\times j
\]

有差分和乘积的一些相关性质可以得出它们之间次数的关系:

\[t_n-1=t_{n-1}+1
\]

而当\(n=0\)时,有\(t_0=0\),所以容易推出\(t_n=2n\)

因此我们知道了\(f_{n,i}\)是关于\(i\)的\(2n\)次多项式,那么直接暴力DP求出\(f_{n,1}\)到\(f_{n,2n+1}\),然后插值出\(f(n,A)\)的值即可

CODE

#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=505;
int A,n,m,f[N][N<<1],g[N<<1],fact[N<<1],mod;
inline int sum(CI a,CI b)
{
int t=a+b; return t>=mod?t-mod:t;
}
inline int sub(CI a,CI b)
{
int t=a-b; return t<0?t+mod:t;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
inline void DP(CI n,CI m)
{
RI i,j; for (RI i=0;i<=m;++i) f[0][i]=1;
for (i=1;i<=n;++i) for (j=1;j<=m;++j)
f[i][j]=sum(1LL*f[i-1][j-1]*j%mod,f[i][j-1]);
}
inline int Lagerange(CI n,int *f,CI k)
{
if (k<=n) return f[k]; RI i; int ret=0,mt=1;
for (i=1;i<=n;++i) mt=1LL*mt*(k-i)%mod; for (i=1;i<=n;++i)
{
int tp=1LL*mt*quick_pow(k-i)%mod*f[i]%mod;
int dv=1LL*fact[i-1]*fact[n-i]%mod; tp=1LL*tp*quick_pow(dv)%mod;
if ((n-i)&1) ret=sub(ret,tp); else ret=sum(ret,tp);
}
return ret;
}
int main()
{
scanf("%d%d%d",&A,&n,&mod); DP(n,m=n<<1|1);
RI i; for (i=1;i<=m;++i) g[i]=f[n][i];
for (fact[0]=i=1;i<=m;++i) fact[i]=1LL*fact[i-1]*i%mod;
return printf("%d",1LL*Lagerange(m,g,A)*fact[n]%mod),0;
}

Luogu P4463 [国家集训队] calc的更多相关文章

  1. P4463 [国家集训队] calc(拉格朗日插值)

    传送门 设\(dp[i][j]\)为考虑\(i\)个数,其中最大值不超过\(j\)的答案,那么转移为\[dp[i][j]=dp[i-1][j-1]\times i\times j+dp[i][j-1] ...

  2. p4463 [国家集训队] calc

    分析 代码 #include<bits/stdc++.h> using namespace std; ][],Ans; inline int pw(int x,int p){ ; whil ...

  3. [国家集训队] calc(动规+拉格朗日插值法)

    题目 P4463 [国家集训队] calc 集训队的题目真是做不动呀\(\%>\_<\%\) 朴素方程 设\(f_{i,j}\)为前\(i\)个数值域\([1,j]\),且序列递增的总贡献 ...

  4. luogu P2757 [国家集训队]等差子序列

    题目链接 luogu P2757 [国家集训队]等差子序列 题解 线段树好题 我选择暴力 代码 // luogu-judger-enable-o2 #include<cstdio> inl ...

  5. luogu P2619 [国家集训队2]Tree I

    题目链接 luogu P2619 [国家集训队2]Tree I 题解 普通思路就不说了二分增量,生成树check 说一下坑点 二分时,若黑白边权有相同,因为权值相同优先选白边,若在最有增量时出现黑白等 ...

  6. [Luogu P1829] [国家集训队]Crash的数字表格 / JZPTAB (莫比乌斯反演)

    题面 传送门:洛咕 Solution 调到自闭,我好菜啊 为了方便讨论,以下式子\(m>=n\) 为了方便书写,以下式子中的除号均为向下取整 我们来颓柿子吧qwq 显然,题目让我们求: \(\l ...

  7. Luogu P1297 [国家集训队]单选错位

    P1297 [国家集训队]单选错位 题目背景 原 <网线切割>请前往P1577 题目描述 gx和lc去参加noip初赛,其中有一种题型叫单项选择题,顾名思义,只有一个选项是正确答案.试卷上 ...

  8. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

  9. [国家集训队] calc

    嘟嘟嘟 这道题dp虽然不难,但是我还是没推出来,感觉最近脑子不太好用啊. 于是就跑去问神仙gjx(全国前三!)了.(外出集训真是好) 神仙不愧是神仙,一会儿就想出来了,而且方法还比网上的题解好懂. d ...

随机推荐

  1. python序列化之pickle,json,shelve

    模块 支持方法 说明 json dumps/dump loads/load 只能处理基本数据类型: 用于多种语言间的数据传输: pickle dumps/dump loads/load 支持pytho ...

  2. Flutter实战视频-移动电商-28.列表页_商品列表后台接口调试

    28.列表页_商品列表后台接口调试 主要调试商品列表页的接口 这个接口是最难的因为有大类.小类还有上拉加载 先配置接口 config/service_url.dart //const serviceU ...

  3. 一个IP绑定多个域名的实现方法

    方案一: 文字叙述: 具体步骤如下:比如讲apache服务器127.0.0.1 配置成 www.sohu.com 首先在http.conf文件中 做如下处理: ①关闭默认的 #DocumentRoot ...

  4. 【转】Win8 下 管理无线网络

    Ref:http://windows.microsoft.com/zh-CN/windows-8/manage-wireless-network-profiles 管理无线网络配置文件 适用于 Win ...

  5. Git小白到老鸟的进阶之路

    点"计算机视觉life"关注,置顶更快接收消息! 小白:师兄,师兄,上次你教我的操作,我傻乎乎的执行了一遍,可是那个Git究竟是什么那? 师兄:小白莫慌,Git就是一种版本控制,小 ...

  6. Unity AnimatorController注意事项

    通过assetbundle加载的单独打包AnimatorController使用下面方法赋值 Go.GetComponent<Animator>().runtimeAnimatorCont ...

  7. Python 3.x 的一些注意事项

    1. reload 被更改 需要 在console执行 from imp import reload 才能调用CT 同时,如果py文件是位于主文件夹深部的位置,可以这么做: import ComicT ...

  8. bzoj 5120: [2017国家集训队测试]无限之环【最小费用最大流】

    玄妙的建图-- 这种平衡度数的题按套路是先黑白染色然后分别连ST点,相邻格子连黑向白连费用1流量0的边,然后考虑费用怎么表示 把一个点拆成五个,上下左右中,中间点黑白染色连ST, 对于连S的点,中点连 ...

  9. 使用Decimal.js解决前端计算金钱失真问题

    1.加载 $ npm install --save decimal.js 2.页面导入 import {Decimal} from 'decimal.js' 3.使用 // 加法 new Decima ...

  10. 3.Python自我修炼(升仙中....整数,布尔值,字符串,for循环)

    python学习(整数,布尔值,字符串,for循环) 1.整数 ​ 在python3中所有的整数都是int类型. 但在python2中如果数据量比较大. 会使用long类型.但是在python3中不存 ...