calc BZOJ 2655
calc
【问题描述】
一个序列a1,...,an是合法的,当且仅当:
长度为给定的n。
a1,...,an都是[1,A]中的整数。
a1,...,an互不相等。
一个序列的值定义为它里面所有数的乘积,即a1a2...an。
求所有不同合法序列的值的和。
两个序列不同当且仅当他们任意一位不一样。
输出答案对一个数mod取余的结果。
【输入格式】
一行3个数,A,n,mod。意义为上面所说的。
【输出格式】
一行结果。
【样例输入】
9 7 10007
【样例输出】
3611
HINT
【数据规模】
0:A<=10,n<=10。
1..3:A<=1000,n<=20。
4..9:A<=10^9,n<=20。
10..19:A<=10^9,n<=500。。
全部:mod<=10^9,并且mod为素数,mod>A>n+1。
题解:
设 f[i][j] 为用不大于A的数组成的有序合法序列方案数
转移方程:(是否选取 i 这个数字)
题目要求无序,那么最后乘上 n! 即可
细心观察一小下,发现它是一个有 2n 项的多项式
用拉格朗日插值法:
1 #include<cmath> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 typedef long long lo; 9 inline int Get() 10 { 11 int x; 12 char c; 13 bool o = false; 14 while((c = getchar()) < '0' || c > '9') 15 if(c == '-') o = true; 16 x = c - '0'; 17 while((c = getchar()) >= '0' && c <= '9') 18 x = x * 10 + c - '0'; 19 return (o) ? -x : x; 20 } 21 const int maxn = 2333; 22 int f[maxn][maxn]; 23 int fac[maxn]; 24 int x[maxn], y[maxn]; 25 int a, n, m, mo; 26 int z, v, ans; 27 int num; 28 inline void Dp() 29 { 30 f[0][0] = 1; 31 for(int i = 1; i <= m; ++i) 32 for(int j = 0; j <= n; ++j) 33 { 34 f[i][j] = f[i - 1][j]; 35 if(j) f[i][j] += (lo) f[i - 1][j - 1] * i % mo; 36 if(f[i][j] >= mo) f[i][j] -= mo; 37 } 38 } 39 inline void Fac() 40 { 41 fac[0] = 1; 42 for(int i = 1; i <= n; ++i) fac[i] = (lo) fac[i - 1] * i % mo; 43 } 44 inline void Sun() 45 { 46 num = 0; 47 for(int i = 0; i <= m; ++i) 48 if(f[i][n]) 49 { 50 x[++num] = i, y[num] = f[i][n]; 51 if(num == (n << 1 | 1)) return; 52 } 53 } 54 inline int Mod(int x) 55 { 56 if(x < 0) x += mo; 57 return x; 58 } 59 inline int Pow(int x, int n) 60 { 61 int sum = 1; 62 while(n) 63 { 64 if(n & 1) sum = (lo) sum * x % mo; 65 x = (lo) x * x % mo; 66 n >>= 1; 67 } 68 return sum; 69 } 70 int main() 71 { 72 a = Get(), n = Get(), mo = Get(); 73 m = n << 2; 74 Dp(); 75 Fac(); 76 if(m >= a) 77 { 78 printf("%d", (lo) f[a][n] * fac[n] % mo); 79 return 0; 80 } 81 Sun(); 82 z = 1; 83 for(int i = 1; i <= num; ++i) z = (lo) z * Mod(a - x[i]) % mo; 84 for(int i = 1; i <= num; ++i) 85 { 86 v = Mod(a - x[i]); 87 for(int j = 1; j <= num; ++j) 88 if(i != j) 89 v = (lo) v * Mod(x[i] - x[j]) % mo; 90 ans = ans + (lo) y[i] * z % mo * Pow(v, mo - 2) % mo; 91 if(ans >= mo) ans -= mo; 92 } 93 printf("%d", (lo) ans * fac[n] % mo); 94 }
转载于:https://www.cnblogs.com/lytccc/p/6616576.html
calc BZOJ 2655相关推荐
- BZOJ 2655 calc (组合计数、DP、多项式、拉格朗日插值)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2655 题解 据说有一种神仙容斥做法,但我不会. 以及貌似网上大多数人的dp和我的做法都不 ...
- bzoj 2655: calc [容斥原理 伯努利数]
2655: calc 题意:长n的序列,每个数\(a_i \in [1,A]\),求所有满足\(a_i\)互不相同的序列的\(\prod_i a_i\)的和 clj的题 一下子想到容斥,一开始从普通容 ...
- 【BZOJ】2655: calc 动态规划+拉格朗日插值
[题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...
- bzoj千题计划269:bzoj2655: calc (拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] * ...
- #莫比乌斯反演#BZOJ 2671 洛谷 4466 和与积 Calc
题目 求有多少对(a,b)(a,b)(a,b)满足1≤a<b≤n1\leq a<b\leq n1≤a<b≤n且a+b∣aba+b|aba+b∣ab 分析 若gcd(a,b)=1gcd ...
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (群论、Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)
题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...
- BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...
- BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)
woc, 13年前的ZJOI就这么毒瘤的嘛... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=1859 (luogu)ht ...
最新文章
- react es6+ 代码优化之路-1
- 选项窗格JTabbedPane
- UVA 122 Trees on the level 二叉树 广搜
- Mac系统修改root用户密码,mac切换root用户登录实例演示
- com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy
- html视频海报代码,如何在网站头部添加视频海报?添加视频海报的方法(代码示例)...
- DEDEv5.6跳转网址修改成直链地址而非动态跳转
- 用DTS将 SQLServer 导出到 Oracle
- linux编译mmc驱动,Embeded linux之MMC驱动
- java 不定参数方法_java中不定长参数的使用方法
- Algorithm学习笔记 --- 迷宫问题
- 9203班级纪律 1202
- Python:如何获取一个用户名的组ID
- C程序设计语言现代方法04:表达式
- Google All in AI 都做了什么?
- 游戏筑基开发之深度优先搜索算法(C语言)
- How-to: Do Statistical Analysis with Impala and R
- 王道考研数据结构笔记
- Emscripten 单词_人教版高中英语单词表音频(汇总版)
- 安卓系统实现播放器变速功能