【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)

题面

BZOJ

洛谷

题解

为啥泥萌做法和我都不一样啊

一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\)的重量,而多个物品也只要\(gcd\)就好了。

现在的问题转变成了有多少个集合\(S\),满足\(S+\{P\}\)中所有数的\(gcd\)是\(w\)的因数。那么实际上就是直接令\(a[i]'=gcd(a[i],P)\),然后选出一个集合使得它是\(gcd(P,w)\)的因数。

考虑对于\(P\)的每个因数预处理答案,不记得在哪里看到的,当\(P\)较大的时候,其约数个数是\(P^{\frac{1}{3}}\)级别,那么在这里就可以暴力把所有因数算出来之后\(O(\sigma^2)\)计算,即先统计有多少个\(a[i]'\)是当前\(d\)的倍数,那么贡献是\(2^{s}-1\),然后容斥减去所有\(d\)的倍数的答案就是\(gcd\)为\(d\)的答案。然后再\(O(\sigma^2)\)的计算约数和就好了。

这样子复杂度大概是\(O((n+Q)logP+\sigma(P)^2)\),前面那个\(log\)来自于\(gcd\)的复杂度。

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define MOD 1000000007
#define MAX 1000100
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,Q,P,a[MAX],bin[MAX];
const int blk=50000;
int w[blk],tot,id1[blk],id2[blk],f[blk],s[blk];
int ID(int x){return x<blk?id1[x]:id2[P/x];}
int S[blk],top;
int main()
{
n=read();Q=read();P=read();
for(int i=1;i<=n;++i)a[i]=__gcd(read(),P);
bin[0]=1;for(int i=1;i<=n;++i)bin[i]=(bin[i-1]<<1)%MOD;
for(int i=1;i*i<=P;++i)
if(P%i==0)
{
w[++tot]=i;
if(P/i!=i)w[++tot]=P/i;
}
sort(&w[1],&w[tot+1]);
for(int i=1;i<=tot;++i)
if(w[i]<blk)id1[w[i]]=i;
else id2[P/w[i]]=i;
for(int i=1;i<=n;++i)s[ID(a[i])]+=1;
for(int i=tot;i;--i)
{
int cnt=0;top=0;
for(int j=i;j<=tot;++j)
if(w[j]%w[i]==0)S[++top]=j,cnt+=s[j];
f[i]=bin[cnt]-1;
for(int j=2;j<=top;++j)f[i]=(f[i]+MOD-f[S[j]])%MOD;
}
for(int i=tot;i;--i)
for(int j=1;j<i;++j)
if(w[i]%w[j]==0)f[i]=(f[i]+f[j])%MOD;
while(Q--)
{
int d=__gcd(read(),P);
printf("%d\n",f[ID(d)]);
}
return 0;
}

【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)的更多相关文章

  1. BZOJ5302: [Haoi2018]奇怪的背包

    BZOJ5302: [Haoi2018]奇怪的背包 https://lydsy.com/JudgeOnline/problem.php?id=5302 分析: 方程\(\sum\limits_{i=1 ...

  2. BZOJ5302 [HAOI2018]奇怪的背包 【数论 + dp】

    题目 小 CC 非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 PP ,当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对 PP 取模后的结果. 现在小 CC 有 nn 种体积不同 ...

  3. BZOJ5302 HAOI2018奇怪的背包(动态规划)

    由裴蜀定理,子集S有解当且仅当gcd(S,P)|w. 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案.注意到这里的gcd一定是P的约数,所以状态数是n√P的.然后可以通过这个得到gcd ...

  4. [BZOJ5302][HAOI2018]奇怪的背包(DP)

    由裴蜀定理得,一个集合S能得到w当且仅当gcd(S+{P})|w. 于是f[i][j]表示前i个物品gcd为j的方案数,发现gcd一定是P的因数,故总复杂度$O(n\sqrt{P}\log P)$(需 ...

  5. [HAOI2018]奇怪的背包 (DP,数论)

    [HAOI2018]奇怪的背包 \(solution:\) 首先,这一道题目的描述很像完全背包,但它所说的背包总重量是在模P意义下的,所以肯定会用到数论.我们先分析一下,每一个物品可以放无数次,可以达 ...

  6. 洛谷 P4495 [HAOI2018]奇怪的背包 解题报告

    P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P ...

  7. haoi2018奇怪的背包题解

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5302 对于一个物品,设它体积为v,那么,在背包参数为p的情况下,它能达到gcd(v,p ...

  8. bzoj 5302: [Haoi2018]奇怪的背包

    Description Solution 首先 \(v_1,v_2,v_3...v_n,P\) 能够构成的最小数是 \(gcd(P,v_1,v_2,v_3...v_n)\) 然后 \(gcd(P,v_ ...

  9. Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】

    题目分析: 首先打个暴力求一下$10^9$以内因子最多的数的因子个数,发现只有$1344$个. 由于有$ax+by=k*(a,b)$和2017年noip的结论,所以我们可以发现对于任意多个数$a_1, ...

随机推荐

  1. css小demo

    span{ color: #ccc; float: right; font-weight: bold; display: inline-block; border-right: solid 1px # ...

  2. 【知乎】WinForm 与 WPF的区别

    你想上班 那么针对公司需求学如果只是自己写着玩 那么区分一下1.你的程序运行在 自己机器a.一个工具而已 要的是cooooooool 那么WPFb.一个工具而已 要的是useful easy 那么wi ...

  3. ELK日志系统+x-pack安全验证

    根据之前已经搭好的ELK系统,现在加一个x-pack插件上去,不然谁拿到ip和端口都可以访问elasticsearch和kibana. 要的效果如下:打开kibana界面的时候要让其输入用户名密码才能 ...

  4. linux audit审计(4)--audit的日志切分,以及与rsyslog的切分协同使用

    audit的规则配置稍微不当,就会短时间内产生大量日志,所以这个规则配置一定要当心.当audit日志写满后,可以看到如下场景: -r-------- 1 root root 8388609 Mar 3 ...

  5. ASP.NET Web.config文件的配置(Configuration API)

    本次我们讨论主要聚焦在以下Web.config配置文件的设置值的读取. 1.<connectionString />连接字符串的读取. 2.<appSettings />应用程 ...

  6. 异步httpclient(httpasyncclient)的使用与总结

    参考:异步httpclient(httpasyncclient)的使用与总结 1. 前言应用层的网络模型有同步与异步.同步意味当前线程是阻塞的,只有本次请求完成后才能进行下一次请求;异步意味着所有的请 ...

  7. js笔记2

    原型:prototype 和 __proto__ prototype 给他即将生成的对象继承下去的属性 prototype: 显式原型,每个function下都有prototype属性,该属性是一个对 ...

  8. Vue命令行工具vue-cli

    前面的话 Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程.只需几分钟即可创建并启动一个带热重载.保存时静态检查以及可用于生 ...

  9. Build 2017 Revisited: .NET, XAML, Visual Studio

    For the next couple months we're going to revisit Build 2017, each post focusing on different aspect ...

  10. table-layui

    本文章为原创文章,转载请注明出处 html <div class="layui-btn-group tableBtn"> <button class=" ...