题目 P4463 [国家集训队] calc 集训队的题目真是做不动呀\(\%>\_<\%\) 朴素方程 设\(f_{i,j}\)为前\(i\)个数值域\([1,j]\),且序列递增的总贡献,则有: \[f_{i,j}=f_{i-1,j-1}*j+f{i,j-1}\] 由于递增序列可以全排列的:\(ans=f_{n,A}×n!\) 时间复杂度\(O(nA)\) 证明一 设\(f_{i,j}\)为关于\(j\)的\(2i\)次多项式,则\(f_{i-1,j-1}*j\)为关于\(j\)的2i-1次…
传送门 设\(dp[i][j]\)为考虑\(i\)个数,其中最大值不超过\(j\)的答案,那么转移为\[dp[i][j]=dp[i-1][j-1]\times i\times j+dp[i][j-1]\] 即最大值不超过\(j-1\)的答案加上最大值刚好为\(j\)的答案,乘上\(i\)是因为\(j\)可以放在\(i\)个数里随便哪个位置 考虑把转移拆开\[dp[i][j]=\sum_{k=0}^{j-1}dp[i-1][k]\times i\times (k+1)\] 如果把\(i\)看成列,…
嘟嘟嘟 这道题dp虽然不难,但是我还是没推出来,感觉最近脑子不太好用啊. 于是就跑去问神仙gjx(全国前三!)了.(外出集训真是好) 神仙不愧是神仙,一会儿就想出来了,而且方法还比网上的题解好懂. dp[i][j]表示用值域为[1, i]的数,凑出的所有合法序列的值的和. 然后规定序列必须是严格递增的,这样答案再乘以一个\(n!\)就行了. 转移的时候,我们考虑\(i\)这个数用不用上,于是有:\(dp[i][j] = dp[i - 1][j] +i * dp[i - 1][j - 1]\).现…
考虑暴力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!. 注意到值域很大,考虑能不能在这一维上优化.完全不会证地有f[i][j]是一个关于j的2i次多项式.那么dp出一部分后就可以直接拉格朗日插值求出多项式,代入即可. #include<iostream> #include<cstdio> #include<cmath> #include<c…
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)\)的,需要用拉格朗日插值进行优化,不会拉格朗日插值的可以看一下浅谈拉格朗…
分析 代码 #include<bits/stdc++.h> using namespace std; ][],Ans; inline int pw(int x,int p){ ; while(p){ )res=1ll*res*x%mod; x=1ll*x*x%mod; p>>=; } return res; } int main(){ int i,j,k; scanf("%d%d%d",&A,&n,&mod); m=*n+; ;i<…
2655: calc Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 428  Solved: 246[Submit][Status][Discuss] Description 一个序列a1,...,an是合法的,当且仅当: 长度为给定的n. a1,...,an都是[1,A]中的整数. a1,...,an互不相等. 一个序列的值定义为它里面所有数的乘积,即a1a2...an. 求所有不同合法序列的值的和. 两个序列不同当且仅当他们任意一位不一样.…
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[1 ~ m]中选出n个数乘积的和, 那么dp[m][n] = dp[m-1][n] + dp[m-1][n-1]*m*n. 但是这道题的m有1e9那么大,不能dp完,不过我们可以发现,dp[x][n] 是关于x的2*n多项式, 所以,我们只要先求出0~2*n的dp值,再用拉格朗日插值法算出dp[m]…
2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Submit][Status][Discuss] Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命……具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只…
P2634 [国家集训队]聪聪可可 淀粉质点分治板子 边权直接 mod 3 直接点分治统计出所有的符合条件的点对再和总方案数约分 至于约分.....gcd搞搞就好辣 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; inline int Max(int a,int b){return a>b?a:b;} void read…