博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
取数字(dp优化)
阅读量:4555 次
发布时间:2019-06-08

本文共 1792 字,大约阅读时间需要 5 分钟。

取数字(dp优化)

给定n个整数\(a_i\),你需要从中选取若干个数,使得它们的和是m的倍数。问有多少种方案。有多个询问,每次询问一个的m对应的答案。

\(1\le n\le 200000,1\le m\le 100,1\le q\le 30,-10^9\le a_i\le 10^9\)

首先有一个暴力dp:\(f[i][j]\)表示选到第i个数,和mod m是j的方案数。但是显然,这个dp是\(O(nm)\)的,然后就tle了。

换一个思路dp?由于我们只需要一个数模m的值,可以先把所有数模m放到桶里,用\(f[i][j]\)表示选到第i个桶,余数和为j的方案数。那么,枚举这一个桶放了多少数k(rh奇怪的dp方法),\(f[i][j+ki]+=f[i-1][j]*\binom{b[i]}{k}\)

这个dp是\(O(nm^2)\)的,能过50%。先把代码放上来:

#include 
#include
using namespace std;typedef long long LL;const LL maxn=4e5+5, maxm=105, mod=1e9+7;LL n, q, m, a[maxn], b[maxm], f[maxm][maxm];LL fac[maxn], inv[maxn];LL C(LL x, LL y){ return fac[x]*inv[y]%mod*inv[x-y]%mod; }LL fpow(LL a, LL x){ LL ans=1, base=a; for (; x; x>>=1, base*=base, base%=mod) if (x&1) ans*=base, ans%=mod; return ans;}int main(){ scanf("%lld%lld", &n, &q); fac[0]=1; inv[0]=1; for (LL i=1; i

我们在\((f[i][(j*i+w)\%m]+=f[i-1][w]*C(b[i], j))\%=mod;\)这行里可以发现:虽然j枚举到了b[i],但是\((j*i+w)\)模了m。因此,只要枚举\(j=[0,m-1]\)就行了!

所以说:

  • dp要多考虑几种方法突破。
  • dp方程里如果带模数,有时是可以优化的。
  • 只要不把求状态的顺序颠倒,可以交换dp中两个循环的位置
#include 
#include
#include
#include
using namespace std;typedef long long LL;const LL maxn=4e5+5, maxm=105, mod=1e9+7;LL n, q, m, a[maxn], b[maxm], f[maxm][maxm];LL fac[maxn], inv[maxn], pre[maxn];inline int min(LL x, LL y){ return x
>=1, base*=base, base%=mod) if (x&1) ans*=base, ans%=mod; return ans;}int getint(){ char c; int flag=1, re=0; for (c=getchar(); !isdigit(c); c=getchar()) if (c=='-') flag=-1; for (re=c-48; c=getchar(), isdigit(c); re=re*10+c-48); return re*flag;}int main(){ scanf("%lld%lld", &n, &q); fac[0]=1; inv[0]=1; for (LL i=1; i

转载于:https://www.cnblogs.com/MyNameIsPc/p/9440952.html

你可能感兴趣的文章
2、文件夹
查看>>
11、求二进制中1的个数
查看>>
【nodejs】让nodejs像后端mvc框架(asp.net mvc)一样处理请求--请求处理结果适配篇(7/8)...
查看>>
CodeForces 731A Night at the Museum
查看>>
MySQL 删除数据库
查看>>
JavaScript 字符串(String) 对象
查看>>
How to use VisualSVN Server and TortoiseSVN to host your codes and control your codes' version
查看>>
微信小程序picker组件 - 省市二级联动
查看>>
Dynamics CRM 给视图配置安全角色
查看>>
Eclipse修改已存在的SVN地址
查看>>
(转)使用 python Matplotlib 库绘图
查看>>
进程/线程切换原则
查看>>
正则表达式语法
查看>>
20165301 2017-2018-2 《Java程序设计》第四周学习总结
查看>>
Vue的简单入门
查看>>
urllib 中的异常处理
查看>>
通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?
查看>>
比较:I/O成员函数getline() 与 get()(第二种用法)的用法异同
查看>>
7.内部类(一)之详解内部类
查看>>
1.messager消息提示框
查看>>