calc

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 377  Solved: 226
[Submit][Status][Discuss]

Description

  一个序列a1,...,an是合法的,当且仅当:
  长度为给定的n。
  a1,...,an都是[1,A]中的整数。
  a1,...,an互不相等。
  一个序列的值定义为它里面所有数的乘积,即a1a2...an。
  求所有不同合法序列的值的和。
  两个序列不同当且仅当他们任意一位不一样。
  输出答案对一个数mod取余的结果。

Input

  一行3个数,A,n,mod。意义为上面所说的。

Output

  一行结果。

Sample Input

9 7 10007

Sample Output

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

Source

不得不说dp设的也是十分好的,估计自己还想不出。

f[i][j]表示,前i个元素中,选择了j个的方案数,这个转移是怎么样的呢?

f[i][j]=f[i-1][j-1]*i*j+f[i-1][j],这个转移中的第二个十分显然,第一个是什么意思,就是选择了i这个元素,

插入到j中的任意一个位置,就是j个位置离随便哪个位置都可以,然后根据乘法的分配律,结合一下,就可以了。

当然j可以大于i,就因为i可以插到后面的位置。

就算想出了这一步,下面发现这个表是一个几次的多项式我基本上不可能会发现

某大佬打了这个表,然后这个多项式怎么搞出来的真的有点厉害

但是这个多项式是没用的,因为这个多项式的系数是变化的,所以没有什么用

有没有一个多项式的系数是不变的呢?
然后就有大佬发现了

发现了这个,即f[i][j]的系数只和j有关,是一个最高项系数是2*j的多项式,然后就稳了,

这样只需要求出2*n+1个点就可以插值了,朗格朗日插值求一下m这个位置的值即可。

 #include<cstring>
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm> #define N 1007
#define ll long long
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,m;
ll p,ans;
ll f[N][N]; ll fast_pow(ll a,ll b)
{
ll ans=;
while(b)
{
if (b&) (ans*=a)%=p;
(a*=a)%=p;
b>>=;
}
return ans;
}
void Lagrange()
{
for (int i=;i<=*n;i++)
{
ll s1=,s2=;
for (int j=;j<=*n;j++)
if (j!=i)
{
(s1*=(m-j))%=p;
(s2*=(i-j))%=p;
}
(ans+=f[i][n]*s1%p*fast_pow(s2,p-)%p)%=p;
}
}
int main()
{
m=read(),n=read(),p=read();
f[][]=;
for (int i=;i<=*n;i++)
{
f[i][]=f[i-][];
for (int j=;j<=n;j++)
f[i][j]=(f[i-][j-]*i%p*j+f[i-][j])%p;
}
if (m<=*n)
{
printf("%lld\n",f[m][n]);
return ;
} Lagrange();
ans=(ans%p+p)%p; printf("%lld\n",ans);
}

bzoj 2566 calc 拉格朗日插值的更多相关文章

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

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

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

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

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

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

  4. P4463 [集训队互测2012] calc 拉格朗日插值 dp 多项式分析

    LINK:calc 容易得到一个nk的dp做法 同时发现走不通了 此时可以考虑暴力生成函数. 不过化简那套不太熟 且最后需要求多项式幂级数及多项式exp等难写的东西. 这里考虑观察优化dp的做法. 不 ...

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

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

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

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

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

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

  8. 【BZOJ2655】Calc(拉格朗日插值,动态规划)

    [BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...

  9. 【BZOJ2655】calc(拉格朗日插值)

    bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...

随机推荐

  1. ULINE(插入水平线)

    WRITE 'This is Underlined'. ULINE. 输出结果: This is Underlined. ———————————————————

  2. WebSocket 的使用

    Java 控制台程序实现类似广播功能 服务器端代码 添加 maven 依赖 <dependency> <groupId>javax.websocket</groupId& ...

  3. Hadoop启动后无法启动NodeManager

    在配置完Hadoop集群后,使用命令:“start-all.sh”进行启动集群.然后使用命令:“jps”查看进程启动情况,发现没有NodeManager 只需要使用命令:cd  /usr/local/ ...

  4. TFS权限配置

            装了TFS,要给TFS里添加用户,然后分配权限.其实一般项目中权限都不会控制的那么细,所以就直接想给项目组的每个人建一个用户,让他们都能访问这个项目的代码并进行任何操作.只想怎么简单怎 ...

  5. Windows Server Backup 裸机恢复

    1.打开“Windows Server Backup”选择本地备份,并在操作栏选择“一次性备份”:(在实际生产环境中可以根据自己的需求,选择一次性备份还是选择备份计划.) 2.打开“一次性备份向导”, ...

  6. 【廖雪峰老师python教程】——OOP

    概述 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 数据封装.继承和多态 ...

  7. 【个人训练】(UVa146)ID Codes

    题意与解析 这题其实特别简单,求给定排列的后继.使用stl(next_permutation)可以方便地解决这个问题.但是,想要自己动手解就是另外一回事了.我的解法是从后往前找到第一个$a_i$比$a ...

  8. Qt 绘制汽车仪表 指针旋转锯齿问题

    在前面几篇中出现的问题 http://blog.csdn.net/z609932088/article/details/53946245 这个是在QWidget下绘制的,出现了指针有锯齿的问题 后面开 ...

  9. Ubuntu下使用Git_1

    这里小小的记录一下我在Ubuntu下使用版本控制工具Git的过程.在学习使用Git的时候,我发现了一个很好的网站,这里分享一下,大家共同学习. 猴子都能懂的Git入门 http://git.wiki. ...

  10. 名片管理系统demo

    # 定义一个列表,用来储存名片 def cardInfors(): # 打印功能提示 print('欢迎使用名片管理系统v6.6.6') print('1:添加一个名片') print('2:删除一个 ...