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. Luogu P4609 [FJOI2016]建筑师&&CF 960G Bandit Blues

    考虑转化题意,我们发现其实就是找一个长度为\(n\)的全排列,使得这个排列有\(A\)个前缀最大值,\(B\)个后缀最大值,求方案数 我们考虑把最大值拎出来单独考虑,同时定义一些数的顺序排列为单调块( ...

  2. mybatis 原理研究

    1. mybatis 是使用JDBC来实现的, 所以需要我们首先了解JDBC 的查询 ①加载JDBC驱动 ②建立并获取数据库连接 ③设置sql语句的传递参数 ④执行sql语句并获得结果 ⑤对结果进行转 ...

  3. table 会有默认的外边框,内部会有分割线

    .表格中边框的显示 只显示上边框 <table frame=above> 只显示下边框 <table frame=below> 只显示左.右边框 <table frame ...

  4. C# 使用Epplus导出Excel [3]:合并列连续相同数据

    C# 使用Epplus导出Excel [1]:导出固定列数据 C# 使用Epplus导出Excel [2]:导出动态列数据 C# 使用Epplus导出Excel [3]:合并列连续相同数据 C# 使用 ...

  5. (34)zabbix Queue队列

    概述 queue(队列)显示监控项等待刷新的时间,可以看到每种agent类型刷新时间,通过queue可以更好的体现出监控的一个指标.正常情况下,是一片绿色. 如果出现过多红色,那么需要留意一下.我们也 ...

  6. GIMP的Path的合并于复制

    1/Path的复制不能像图层一样简单的复制粘贴,只有通过merge的方法实现: 使要合并的Path处于可见状态,右击Path工具栏:   合并前与合并后比较: 2/向不同文件复制Path: 到另外一个 ...

  7. FTP实验报告

    FTP实验报告 制作人:全心全意 准备工作: linux1:192.168.100.4 关闭防火墙.selinux机制 配置yum源 匿名访问 1.安装vsftpd服务和客户端 [root@local ...

  8. linux定时任务执行php任务

    首先用命令检查服务是否在运行 systemctl status crond.service 如果服务器上没有装有crontab ,则可以执行 yum install vixie-cron yum in ...

  9. A Fast and Easy to Use AES Library

    http://www.codeproject.com/Articles/57478/A-Fast-and-Easy-to-Use-AES-Library Introduction EfAesLib i ...

  10. boot_mem分配器

    #define alloc_bootmem_low_pages(x) \ __alloc_bootmem_low(x, PAGE_SIZE, ) void * __init __alloc_bootm ...