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 项的多项式

用拉格朗日插值法:

 #include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long lo;
inline int Get()
{
int x;
char c;
bool o = false;
while((c = getchar()) < '' || c > '')
if(c == '-') o = true;
x = c - '';
while((c = getchar()) >= '' && c <= '')
x = x * + c - '';
return (o) ? -x : x;
}
const int maxn = ;
int f[maxn][maxn];
int fac[maxn];
int x[maxn], y[maxn];
int a, n, m, mo;
int z, v, ans;
int num;
inline void Dp()
{
f[][] = ;
for(int i = ; i <= m; ++i)
for(int j = ; j <= n; ++j)
{
f[i][j] = f[i - ][j];
if(j) f[i][j] += (lo) f[i - ][j - ] * i % mo;
if(f[i][j] >= mo) f[i][j] -= mo;
}
}
inline void Fac()
{
fac[] = ;
for(int i = ; i <= n; ++i) fac[i] = (lo) fac[i - ] * i % mo;
}
inline void Sun()
{
num = ;
for(int i = ; i <= m; ++i)
if(f[i][n])
{
x[++num] = i, y[num] = f[i][n];
if(num == (n << | )) return;
}
}
inline int Mod(int x)
{
if(x < ) x += mo;
return x;
}
inline int Pow(int x, int n)
{
int sum = ;
while(n)
{
if(n & ) sum = (lo) sum * x % mo;
x = (lo) x * x % mo;
n >>= ;
}
return sum;
}
int main()
{
a = Get(), n = Get(), mo = Get();
m = n << ;
Dp();
Fac();
if(m >= a)
{
printf("%d", (lo) f[a][n] * fac[n] % mo);
return ;
}
Sun();
z = ;
for(int i = ; i <= num; ++i) z = (lo) z * Mod(a - x[i]) % mo;
for(int i = ; i <= num; ++i)
{
v = Mod(a - x[i]);
for(int j = ; j <= num; ++j)
if(i != j)
v = (lo) v * Mod(x[i] - x[j]) % mo;
ans = ans + (lo) y[i] * z % mo * Pow(v, mo - ) % mo;
if(ans >= mo) ans -= mo;
}
printf("%d", (lo) ans * fac[n] % mo);
}

calc BZOJ 2655的更多相关文章

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

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

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

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

  3. BZOJ.2655.calc(DP/容斥 拉格朗日插值)

    BZOJ 洛谷 待补.刚刚政治会考完来把它补上了2333.考数学去了. DP: 首先把无序化成有序,选严格递增的数,最后乘个\(n!\). 然后容易想到令\(f_{i,j}\)表示到第\(i\)个数, ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2655 先考虑DP.dp[ i ][ j ]表示值域为 i .选 j 个值的答案,则 dp[ ...

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

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

  6. [BZOJ 2655]calc

    Description 题库链接 给出 \(A,n,p\) ,让你在模 \(p\) 意义下求所有序列 \(a\) 满足"长度为 \(n\) 且 \(a_i\in[1,A]\) ,并且对于 \ ...

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

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

  8. [总结]其他杂项数学相关(定理&证明&板子)

    目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...

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

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

随机推荐

  1. UVA 1220 Party at Hali-Bula (树形DP)

    求一棵数的最大独立集结点个数并判断方案是否唯一. dp[i][j]表示以i为根的子树的最大独立集,j的取值为选和不选. 决策: 当选择i时,就不能选择它的子结点. 当不选i时,它的子结点可选可不选. ...

  2. C++类型强制转换<转>

    转载:http://www.cnblogs.com/goodhacker/archive/2011/07/20/2111996.html C风格的强制类型转换(Type Cast)很简单,不管什么类型 ...

  3. Bootstrap 网页乱码

    问题:今天早上在实践bootstrap的时候,用EditPlus写代码,标签中包含了中文.在浏览器解析的时候中文部分生成的乱码.但是网页部分已经声明了使用utf-8的编码方式. 解决:网页字体正常显示 ...

  4. (54)zabbix链接及解除模板链接

    上一节就已经涉及到了链接与解除模板链接(link与unlink),这篇文章除了说明怎么链接模板以外,还会特别讲到一些需要特别注意的细节. HOST链接模板之后,便继承了模板里定义的item,trigg ...

  5. (35)zabbix Event acknowledgment事件确认

    概述 以往服务器出现报警,运维人员处理完事之后,报警自动取消,但是下一次出现同样一个错误,但是换了一个运维人员,他可能需要重新排查问题,直到问题处理完毕. 针对这种情况,zabbix提供了event ...

  6. HUAWEI交换机配置telnet登录

    Huawei交换机配置Telnet登录 一,交换机开启Telnet服务 <Huawei>system-view                                        ...

  7. Linux等待队列与唤醒

    1.数据结构 1.1等待队列头 struct __wait_queue_head { spinlock_t lock; struct list_head task_list; }; typedef s ...

  8. mysql 面安装配置

    解压MySQL压缩包    将以下载的MySQL压缩包解压到自定义目录下,我的解压目录是:    "D:\Program Files\MySQL\mysql-5.6.13-win32&quo ...

  9. win10关闭防火墙命令

    NetSh Advfirewall set allprofiles state off #关闭防火墙 Netsh Advfirewall show allprofiles #查看防火墙状态

  10. 九度oj 1480

    题目描述: 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列(a1, a2, ...,aN),我们可以得到一些上升的子序列( ...