BZOJ2655 calc
拉格朗日插值+dp
直接dp是n立方的,我们考虑优化。
dp式子为f[i][j]=f[i-1][j-1]*j*i+f[i-1][j]表示i个元素选j个的答案
然后发现最高次就是2j次,所以我们预处理出2n个点的值再用拉格朗日一插就好。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int A,n,mod;
int qmod(int a,int b)
{
int ans=;
while(b)
{
if(b&)ans=1ll*ans*a%mod;
b>>=;a=1ll*a*a%mod;
}
return ans;
}
ll f[][],inv[],las[],fac[],pre[],ans;
int main()
{
scanf("%d%d%d",&A,&n,&mod);
f[][]=;
for(int i=;i<=min(n*,A);++i)
for(int j=;j<=n;++j)
if(j)f[i][j]=(1ll*i%mod*j%mod*f[i-][j-]%mod+f[i-][j])%mod;
else f[i][j]=f[i-][j];
if(A<=n*){
printf("%d\n",f[A][n]);
return ;
}
inv[]=inv[]=fac[]=inv[]=;
pre[]=A%mod;
for(int i=;i<=n*;++i)
{
pre[i]=pre[i-]*(A-i)%mod;
fac[i]=fac[i-]*i%mod;
}
las[n*]=(A-n*)%mod;inv[n*]=qmod(fac[n*],mod-);
for(int i=n*-;i>=;--i)las[i]=las[i+]*(A-i+mod)%mod;
for(int i=n*-;i>=;--i)inv[i]=inv[i+]*(i+)%mod;
for(int i=;i<=n*;++i)
{
ll INV,FAC=;
if((n*-i)&)INV=-1ll*inv[i]*inv[n*-i]%mod;
else INV=1ll*inv[i]*inv[n*-i]%mod;
if(i>)FAC=pre[i-]%mod;
if(i<n*)FAC=FAC*las[i+]%mod;
ans=(ans+FAC*f[i][n]%mod*INV%mod)%mod;
}
printf("%lld\n",(ans+mod)%mod);
return ;
}
BZOJ2655 calc的更多相关文章
- BZOJ2655 Calc - dp 拉格朗日插值法
BZOJ2655 Calc 参考 题意: 给定n,m,mod,问在对mod取模的背景下,从[1,m]中选出n个数相乘可以得到的总和为多少. 思路: 首先可以发现dp方程 ,假定dp[m][n]表示从[ ...
- [BZOJ2655]calc(拉格朗日插值法+DP)
2655: calc Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 428 Solved: 246[Submit][Status][Discuss] ...
- BZOJ2655 calc(动态规划+拉格朗日插值法)
考虑暴力dp:f[i][j]表示i个数值域1~j时的答案.考虑使其值域++,则有f[i][j]=f[i][j-1]+f[i-1][j-1]*i*j,边界f[i][i]=i!*i!. 注意到值域很大,考 ...
- BZOJ2655: calc(dp 拉格朗日插值)
题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...
- 2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)
传送门 题意简述:问有多少数列满足如下条件: 所有数在[1,A][1,A][1,A]之间. 没有相同的数 数列长度为nnn 一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和. A≤1e9,n ...
- bzoj千题计划269:bzoj2655: calc (拉格朗日插值)
http://www.lydsy.com/JudgeOnline/problem.php?id=2655 f[i][j] 表示[1,i]里选严格递增的j个数,序列值之和 那么ans=f[A][n] * ...
- PKUSC2018训练日程(4.18~5.30)
(总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...
- 【BZOJ2655】Calc(拉格朗日插值,动态规划)
[BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...
- 【BZOJ2655】calc(拉格朗日插值)
bzoj 题意: 给出\(n\),现在要生成这\(n\)个数,每个数有一个值域\([1,A]\).同时要求这\(n\)个数两两不相同. 问一共有多少种方案. 思路: 因为\(A\)很大,同时随着值域的 ...
随机推荐
- map文件的使用
map文件相信大家并不陌生,大家都知道是用来调试的,但是具体怎么用你又清不清楚呢? 其实也很简单 1.拿JQ为例,我们需要备有jquery.js.jquery.min.js.jquery.min.ma ...
- jQuery 实现 bootstrap 模态框 删除确认
思路: 点击删除按钮,通过jquery将删除操作的URL赋值到页面URL元素,并弹出会话框 用户点击确认,通过jquery获取URL,并发送删除请求至后台. 一.删除button <a clas ...
- vue注册全局属性
例:统一引用getSpiderToken方法 main.js中相关代码 import { getSpiderToken } from '../static/js/storage' Vue.protot ...
- 20155325 2016-2017-2 《Java程序设计》第8周学习总结
教材学习内容总结 NIO用于高级输入/输出处理 名称 衔接数据源与目的地 IO InputStream,OutputStream NIO Channel 类 方法 方法的作用 ReadableByte ...
- es6笔记(5)Map数据结构
概要 字典是用来存储不重复key的Hash结构.不同于集合(Set)的一点,字典使用的是[key,value]的形式来存储数据. JavaScript的对象(Object:{})只能用字符串当做key ...
- svn使用笔记
一.checkout:第一次下载trunk里面的代码到本地 二.commit:提交一些修改* out of date : 本地版本号 < 服务器版本号* 如果过期,就update,可能会出现co ...
- 华中邀请赛现场赛F题 Seats
题目链接:http://acm.whu.edu.cn/land/problem/detail?problem_id=1552 解题报告:题目意思应该很清楚,就是有n个人,分别属于7个班级,然后他们坐成 ...
- mysql主从复制跳过复制错误【转】
跳过复制错误 mysql因为binlog机制问题,有些时候会出现从库重放sql执行失败的情况,特别是旧的STATEMENT模式最容易出现这种情况(因为函数和存储过程等原因),这也是为什么强调使用mix ...
- 秘钥登录服务器执行shell脚本
做自动化的时候,有时候避免不了要和服务器有互动,刚巧碰上一个项目,需要执行命令才能完成本次测试. 昨天遇到的是秘钥形式的,只有秘钥和用户名,百度找了许久也没有思路,(能账号密码登录服务器的还简单些), ...
- PHP转盘抽奖算法
流程: 1.拼装奖项数组 2.计算概率 3.返回中奖情况 代码如下: 中奖概率 ' v ' 可以在后台设置,传到此方法中,注意传整数 function get_gift(){ //拼装奖项数组 // ...