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相关推荐

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

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

  2. bzoj 2655: calc [容斥原理 伯努利数]

    2655: calc 题意:长n的序列,每个数\(a_i \in [1,A]\),求所有满足\(a_i\)互不相同的序列的\(\prod_i a_i\)的和 clj的题 一下子想到容斥,一开始从普通容 ...

  3. 【BZOJ】2655: calc 动态规划+拉格朗日插值

    [题意]一个序列$a_1,...,a_n$合法当且仅当它们都是[1,A]中的数字且互不相同,一个序列的价值定义为数字的乘积,求所有序列的价值和.n<=500,A<=10^9,n+1< ...

  4. bzoj千题计划269:bzoj2655: calc (拉格朗日插值)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] * ...

  5. #莫比乌斯反演#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 ...

  6. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (群论、Burnside引理、组合计数)

    题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...

  7. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)

    题目链接 (Luogu) https://www.luogu.org/problem/P4727 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.ph ...

  8. BZOJ 2669 Luogu P3160 [CQOI2012]局部极小值 (容斥原理、DP)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=2669 (luogu) https://www.luogu.org/prob ...

  9. BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)

    woc, 13年前的ZJOI就这么毒瘤的嘛... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=1859 (luogu)ht ...

最新文章

  1. react es6+ 代码优化之路-1
  2. 选项窗格JTabbedPane
  3. UVA 122 Trees on the level 二叉树 广搜
  4. Mac系统修改root用户密码,mac切换root用户登录实例演示
  5. com.rr.domain.Department_$$_javassist_5 cannot be cast to javassist.util.proxy.Proxy
  6. html视频海报代码,如何在网站头部添加视频海报?添加视频海报的方法(代码示例)...
  7. DEDEv5.6跳转网址修改成直链地址而非动态跳转
  8. 用DTS将 SQLServer 导出到 Oracle
  9. linux编译mmc驱动,Embeded linux之MMC驱动
  10. java 不定参数方法_java中不定长参数的使用方法
  11. Algorithm学习笔记 --- 迷宫问题
  12. 9203班级纪律 1202
  13. Python:如何获取一个用户名的组ID
  14. C程序设计语言现代方法04:表达式
  15. Google All in AI 都做了什么?
  16. 游戏筑基开发之深度优先搜索算法(C语言)
  17. How-to: Do Statistical Analysis with Impala and R
  18. 王道考研数据结构笔记
  19. Emscripten 单词_人教版高中英语单词表音频(汇总版)
  20. 安卓系统实现播放器变速功能

热门文章

  1. 2018.09.19python学习第七天part1
  2. 有向图的拓扑排序算法JAVA实现
  3. wordpress 迁移网站更改域名解决图片无法显示
  4. Oracle中的不等于号
  5. 在.NET中使用Speex -- 音频数据编解码
  6. apache多域名绑定手记
  7. Visual Studio 剪切板新特性
  8. python 面试题(2)--- 字符串连接问题
  9. jq fileupload 设置最大文件大小5m_我猜你并不会设置“分辨率”
  10. bash中的grep函数_如何在Bash中编写函数