BZOJ

洛谷

待补。刚刚政治会考完来把它补上了2333。考数学去了。


DP:

首先把无序化成有序,选严格递增的数,最后乘个\(n!\)。

然后容易想到令\(f_{i,j}\)表示到第\(i\)个数,当前选的是\(j\)的价值和。复杂度是\(O(nA)\)的。然后忘掉这个做法吧这个做法没前途。

上面这个做法最后还要\(O(A)\)求一遍和,感觉不够优美。

直接令\(f_{i,j}\)表示选了\(i\)个数,选的最大的数\(\leq j\)的价值和。转移为:\(f_{i,j}=f_{i,j-1}+f_{i-1,j-1}\times j\)。

复杂度还是\(O(nA)\)。最后的答案就是\(f_{n,A}\)。

(以后遇到这种DP要注意)打表差分或是看题解可以发现,\(f_{i,j}\)是一个关于\(j\)的\(2i\)次的多项式。

把\(f_{i,j}\)展开大概就是这样:\(f_{i,j}=\sum\limits_{k=1}^{j-1}f_{i-1,k}\times(k+1)\),求和会给多项式次数+1,乘\(k+1\)其实就是乘的\(x+1\)(并不算个常数),所以多项式次数也会+1,所以是\(2i\)次的。

那就可以暴力\(n^2\)DP算出\(2n+1\)个\(f_{n,0,1...2n}\)的值,然后拉格朗日插值就可以得到\(f_{n,A}\)了。

复杂度\(O(n^2)\)。


容斥:

令\(f_i\)表示\(n=i\)时的答案,转移的时候枚举,强制令\(j\)个数和\(i\)选的数相同,容斥一下,那么:$$f_i=\sum\limits_{j=0}{i-1}(-1)jA_{i-1}^jf_{i-j-1}g(j+1)$$

其中\(g(j)=\sum_{i=1}^Ai^j\),就是选\(j\)个相同数的贡献和。可以用伯努利数/拉格朗日插值\(O(n^2)\)预处理。

至于为啥是\(A_{i-1}^j\)不是\(C_{i-1}^j\)...不怎么会解释...不管了感性理解了。


代码是DP的。

//2804kb	160ms
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
#define Mod(x) x>=mod&&(x-=mod)
#define Add(x,v) (x+=v)>=mod&&(x-=mod)
typedef long long LL;
const int N=1003; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now;
}
inline int FP(int x,int k,const int mod)
{
int t=1;
for(; k; k>>=1,x=1ll*x*x%mod)
if(k&1) t=1ll*t*x%mod;
return t;
}
int Lagrange(const int *y,const int n,const int x,const int mod)
{
static int pre[N],suf[N],ifac[N];
pre[0]=x, suf[n+1]=1; LL tmp=1;
for(int i=1; i<=n; ++i) pre[i]=1ll*pre[i-1]*(x+mod-i)%mod, tmp=tmp*i%mod;
ifac[n]=FP(tmp,mod-2,mod);
for(int i=n; i; --i) suf[i]=1ll*suf[i+1]*(x+mod-i)%mod, ifac[i-1]=1ll*i*ifac[i]%mod;
LL ans=0;
for(int i=0,up,down; i<=n; ++i)
{
if(i) up=1ll*y[i]*pre[i-1]%mod*suf[i+1]%mod;
else up=1ll*y[i]*suf[i+1]%mod;
down=(n-i)&1?mod-1ll*ifac[i]*ifac[n-i]%mod:1ll*ifac[i]*ifac[n-i]%mod;
ans+=1ll*up*down%mod;
}
return ans%mod;
} int main()
{
static int f[503][N]; const int A=read(),n=read(),mod=read(),n2=n<<1;
for(int i=1; i<=n2; ++i) f[1][i]=f[1][i-1]+i, Mod(f[1][i]);
for(int i=2; i<=n; ++i)
for(int j=1; j<=n2; ++j)
f[i][j]=f[i][j-1]+1ll*f[i-1][j-1]*j%mod, Mod(f[i][j]);
LL fac=1;
for(int i=2; i<=n; ++i) fac=fac*i%mod;
printf("%lld\n",fac*Lagrange(f[n],n2,A,mod)%mod); return 0;
}
//void Violence()
//{
// static int f[N][N],g[N][N];
// const int A=read(),n=read(),mod=1000000007;
// for(int i=1; i<=A; ++i) f[1][i]=f[1][i-1]+i, Mod(f[1][i]);
// for(int i=2; i<=n; ++i)
// {
// for(int j=1; j<=A; ++j)
// f[i][j]=f[i][j-1]+1ll*f[i-1][j-1]*j%mod, Mod(f[i][j]);
// printf("\ni:%d\n",i);
// for(int j=1; j<=A; ++j) printf("%d ",g[i][j]=f[i][j]); puts("");
// for(int k=1; k<=10; ++k)
// {
// printf("k:%d\n",k);
// for(int j=1; j<=A-k; ++j) g[i][j]=g[i][j+1]-g[i][j], printf("%d ",g[i][j]);
// puts("");
// }
// }
// int fac=1;
// for(int i=2; i<=n; ++i) fac=1ll*fac*i%mod;
// printf("%lld\n",fac%mod*f[n][A]%mod);
//}

BZOJ.2655.calc(DP/容斥 拉格朗日插值)的更多相关文章

  1. BZOJ.4559.[JLOI2016]成绩比较(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 为什么已经9点了...我写了多久... 求方案数,考虑DP... \(f[i][j]\)表示到第\(i\)门课,还有\(j\)人会被碾压的方案数. 那么\[f[i][j]=\sum_{ ...

  2. bzoj 3622 DP + 容斥

    LINK 题意:给出n,k,有a,b两种值,a和b间互相配对,求$a>b$的配对组数-b>a的配对组数恰好等于k的情况有多少种. 思路:粗看会想这是道容斥组合题,但关键在于如何得到每个a[ ...

  3. 【BZOJ】4559: [JLoi2016]成绩比较 计数DP+排列组合+拉格朗日插值

    [题意]n位同学(其中一位是B神),m门必修课,每门必修课的分数是[1,Ui].B神碾压了k位同学(所有课分数<=B神),且第x门课有rx-1位同学的分数高于B神,求满足条件的分数情况数.当有一 ...

  4. 【BZOJ 4665】 4665: 小w的喜糖 (DP+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 94  Solved: 53 Description 废话不多说,反正小w要发喜 ...

  5. bzoj4559[JLoi2016]成绩比较 容斥+拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  6. [Luogu P1450] [HAOI2008]硬币购物 背包DP+容斥

    题面 传送门:https://www.luogu.org/problemnew/show/P1450 Solution 这是一道很有意思的在背包里面做容斥的题目. 首先,我们可以很轻松地想到暴力做背包 ...

  7. BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...

  8. bzoj 2655 calc —— 拉格朗日插值

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先设 f[i][j] 表示长度为 i 的序列,范围是 1~j 的答案: 则 f[i][ ...

  9. BZOJ 2655: calc(拉格朗日插值)

    传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...

随机推荐

  1. 使用git克隆项目、从dev分支上更新代码以及将代码提交到Coding(或GitHub)上面

    本教程的目的: 这是个crm项目中,有两个分支一个是master 和 dev ,master主分支,不允许提交代码,我要拉去dev分支上最新的代码,并将修改后的项目,在推送到dev分支上. 一. 1. ...

  2. 原创 《算法》java第四版,标准输入

      <算法>学习过程中,在eclipse里调试时,对于官方提供的源码中标准输入的操作,没有搞懂 自己改了一下,直接读取本地测试数据测试数据可在http://algs4.cs.princet ...

  3. ruby安装sass和compass步骤

    依赖ruby,所以需要安装Ruby 如何安装Ruby呢?在windows下通过RubyInstaller来安装,安装过程中需要选择第二项 1.ruby -v 2.gem install sass (如 ...

  4. Windows文件系统

    微软在Dos/Windows系列操作系统中共使用了6种不同的文件系统(包括即将在windows的下一个版本中使用的Winfs).它们分别是:FAt12.FAT16.FAT32.NTFS.NTFS5.0 ...

  5. 论文阅读笔记二-ImageNet Classification with Deep Convolutional Neural Networks

    分类的数据大小:1.2million 张,包括1000个类别. 网络结构:60million个参数,650,000个神经元.网络由5层卷积层,其中由最大值池化层和三个1000输出的(与图片的类别数相同 ...

  6. BZoj 2301 Problem b(容斥定理+莫比乌斯反演)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec  Memory Limit: 256 MB Submit: 7732  Solved: 3750 [Submi ...

  7. 006-Python函数

    Python函数(def) 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.Python提供了许多内建函数,比如print().但你也可以自己创建函数,这被叫做用户自定义函数.函数能 ...

  8. js调试console.log使用总结图解

    一 实例 打印字符串和对象: 可展开对象查看内部情况: 看一下console对象本身的定义情况: 输出对象情况: utag对象所在文件: 输出对象: 二 Console.log 总结 1   如果你j ...

  9. win10远程桌面出现身份验证错误。要求的函数不受支持

    打开组策略,依次展开“计算机配置”->“管理模板”->“系统”->“凭据分配”,设置名称: “加密 Oracle 修正” 为已启用,并设置保护级别为“易受攻击”

  10. ElasticSearch文档及分布式文档存储

    1.什么是文档? 文档由索引(_index),类型(_type),唯一标识(_id) 组成,我们为 _index(索引) 分配相关逻辑地址分片,该索引下的数据会根据索引以及类型计算哈希来分配数据存储的 ...