BZOJ2655 Calc - dp 拉格朗日插值法

时间:2022-09-09 11:42:08

BZOJ2655 Calc

参考

题意:

  给定n,m,mod,问在对mod取模的背景下,从【1,m】中选出n个数相乘可以得到的总和为多少。

思路:

  首先可以发现dp方程 ,假定dp【m】【n】表示从【1 ~ m】中选出n个数乘积的和,

那么dp【m】【n】 = dp【m-1】【n】 + dp【m-1】【n-1】*m*n。

但是这道题的m有1e9那么大,不能dp完,不过我们可以发现,dp【x】【n】 是关于x的2*n多项式,

所以,我们只要先求出0~2*n的dp值,再用拉格朗日插值法算出dp【m】【n】的即可。

#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <iomanip>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <cctype>
#include <queue>
#include <cmath>
#include <list>
#include <map>
#include <set>
using namespace std;
//#pragma GCC optimize(3)
//#pragma comment(linker, "/STACK:102400000,102400000") //c++
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull; typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int ,pii> p3;
//priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFFLL; //
const ll nmos = 0x80000000LL; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3fLL; // const double PI=acos(-1.0); template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
}
// #define _DEBUG; //*//
#ifdef _DEBUG
freopen("input", "r", stdin);
// freopen("output.txt", "w", stdout);
#endif
/*-----------------------show time----------------------*/ const int maxn = ;
ll dp[maxn][maxn],x[maxn],y[maxn];
int m,n,mod; ll ksm (ll a,ll b){
ll res = ;
while(b>){
if(b&) res = (res * a)%mod;
a = (a * a)%mod;
b >>= ;
}
return res;
}
ll lagerange(int k){
ll res = ;
for(int i=; i<=*n; i++){
ll s1=,s2 = ; for(int j=; j<=*n; j++){
if(i==j)continue;
s1 = 1ll*(s1 * (k - x[j] + mod)%mod)%mod;
s2 = 1ll*(s2 * ((x[i] - x[j] + mod)%mod))%mod;
}
res = (res + 1ll*s1 * ksm(s2,mod-) % mod * y[i] % mod+mod)%mod;
}
return res;
}
int main(){ scanf("%d%d%d", &m, &n, &mod);
dp[][] = ;
for(int i=; i<=*n; i++){
dp[i][] = ;
for(int j=; j<=n; j++){
dp[i][j] = 1ll*dp[i-][j-] * i % mod * j + dp[i-][j];
dp[i][j] = dp[i][j]%mod;
}
} if(m <= * n){
printf("%lld\n", dp[m][n]);
return ;
} for(int i=; i<=*n; i++) x[i] = i,y[i] = dp[i][n]; printf("%lld\n",lagerange(m)); return ;
}

BZOJ2655

BZOJ2655 Calc - dp 拉格朗日插值法的更多相关文章

  1. BZOJ2655&colon; calc&lpar;dp 拉格朗日插值&rpar;

    题意 题目链接 Sol 首先不难想到一个dp 设\(f[i][j]\)表示选了\(i\)个严格递增的数最大的数为\(j\)的方案数 转移的时候判断一下最后一个位置是否是\(j\) \[f[i][j] ...

  2. &lbrack;BZOJ2655&rsqb;calc&lpar;拉格朗日插值法&plus;DP&rpar;

    2655: calc Time Limit: 30 Sec  Memory Limit: 512 MBSubmit: 428  Solved: 246[Submit][Status][Discuss] ...

  3. &lbrack;国家集训队&rsqb; calc&lpar;动规&plus;拉格朗日插值法&rpar;

    题目 P4463 [国家集训队] calc 集训队的题目真是做不动呀\(\%>\_<\%\) 朴素方程 设\(f_{i,j}\)为前\(i\)个数值域\([1,j]\),且序列递增的总贡献 ...

  4. bzoj千题计划269:bzoj2655&colon; calc &lpar;拉格朗日插值)

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

  5. 【BZOJ】2655&colon; calc 动态规划&plus;拉格朗日插值

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

  6. bzoj4559&lbrack;JLoi2016&rsqb;成绩比较 容斥&plus;拉格朗日插值法

    4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 261  Solved: 165[Submit][Status ...

  7. Matlab数值计算示例: 牛顿插值法、LU分解法、拉格朗日插值法、牛顿插值法

    本文源于一次课题作业,部分自己写的,部分借用了网上的demo 牛顿迭代法(1) x=1:0.01:2; y=x.^3-x.^2+sin(x)-1; plot(x,y,'linewidth',2);gr ...

  8. 拉格朗日插值法——用Python进行数值计算

    插值法的伟大作用我就不说了.... 那么贴代码? 首先说一下下面几点: 1. 已有的数据样本被称之为 "插值节点" 2. 对于特定插值节点,它所对应的插值函数是必定存在且唯一的(关 ...

  9. CPP&amp&semi;MATLAB实现拉格朗日插值法

    开始学习MATLAB(R和Python先放一放...),老师推荐一本书,看完基础就是各种算法...首先是各种插值.先说拉格朗日插值法,这原理楼主完全不懂的,查的*,好久才看懂.那里讲的很详细,这 ...

随机推荐

  1. PHP计算一年有多少周,每周开始日期和结束日期

    一年有多个周,每周的开始日期和结束日期 参考代码一:[正在使用的版本] <?php header("Content-type:text/html;charset=utf-8" ...

  2. &lbrack;ACM&lowbar;几何&rsqb; The Deadly Olympic Returns&excl;&excl;&excl; (空间相对运动之最短距离)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=28235#problem/B 题目大意: 有两个同时再空间中匀速运动的导弹,告诉一个时间以 ...

  3. LINQ to Entities 查询语法

    转自: http://www.cnblogs.com/asingna/archive/2013/01/28/2879595.html 实体框架(Entity Framework )是 ADO.NET  ...

  4. Spring Data Jpa 详解

    前言: JPA全称Java Persistence API,即Java持久化API,它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据,结合其他ORM的使用,能达到简化开发 ...

  5. 加密传输SSL协议1&lowbar;OpenSSL的安装

    终于在自己不断的奋斗之后,来到科大的一波考试过去了,但是为了不使自己过于放松,回顾一下之前的东西,做一下笔记.所以新开一个专题笔记: Using Apache with SSL 引入:首先我们在平时的 ...

  6. Python学习之---冒泡,选择,插入排序

    Python学习之---冒泡,选择,插入排序 最近学习了python基础,写一下3大排序练练手: 1 ''' 2 Created on 2013-8-23 3 4 @author: codegeek ...

  7. 免费下载获取Odoo中文实施 应用 指南 手册

    引言 Odoo,以前叫OpenERP,是比利时Odoo S.A.公司开发的一个企业应用软件套件,开源套件包括一个企业应用快速开发平台,以及几千个Odoo及第三方开发的企业应用模块.Odoo适用于各种规 ...

  8. 妙用valueForKeyPath

    valueForKey与valueForKeyPath在KVC中同时出现,都可以使用,难免让开发者迷惑:心里知道肯定是不一样,但具体的用法你会吗?其实valueForKeyPath的功能更强大,支持深 ...

  9. SpringMVC异步文件上传下载

    首先了解一下File的构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子文件/ ...

  10. python3入门教程(一)之 hello world

    概述 python 这门语言这几年非常的火,很多技术都用的到,像爬虫,大数据,人工智能等,包括很多的小孩都首选python作为入门学习语言,那python 究竟是怎样一门语言呢? Python 是一个 ...