【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)
【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)
题面
题解
为啥泥萌做法和我都不一样啊
一个重量为\(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]奇怪的背包(动态规划,容斥原理)的更多相关文章
- BZOJ5302: [Haoi2018]奇怪的背包
BZOJ5302: [Haoi2018]奇怪的背包 https://lydsy.com/JudgeOnline/problem.php?id=5302 分析: 方程\(\sum\limits_{i=1 ...
- BZOJ5302 [HAOI2018]奇怪的背包 【数论 + dp】
题目 小 CC 非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数 PP ,当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对 PP 取模后的结果. 现在小 CC 有 nn 种体积不同 ...
- BZOJ5302 HAOI2018奇怪的背包(动态规划)
由裴蜀定理,子集S有解当且仅当gcd(S,P)|w. 一个显然的dp是设f[i][j]为前i个数gcd为j的选取方案.注意到这里的gcd一定是P的约数,所以状态数是n√P的.然后可以通过这个得到gcd ...
- [BZOJ5302][HAOI2018]奇怪的背包(DP)
由裴蜀定理得,一个集合S能得到w当且仅当gcd(S+{P})|w. 于是f[i][j]表示前i个物品gcd为j的方案数,发现gcd一定是P的因数,故总复杂度$O(n\sqrt{P}\log P)$(需 ...
- [HAOI2018]奇怪的背包 (DP,数论)
[HAOI2018]奇怪的背包 \(solution:\) 首先,这一道题目的描述很像完全背包,但它所说的背包总重量是在模P意义下的,所以肯定会用到数论.我们先分析一下,每一个物品可以放无数次,可以达 ...
- 洛谷 P4495 [HAOI2018]奇怪的背包 解题报告
P4495 [HAOI2018]奇怪的背包 题目描述 小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P ...
- haoi2018奇怪的背包题解
题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=5302 对于一个物品,设它体积为v,那么,在背包参数为p的情况下,它能达到gcd(v,p ...
- 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_ ...
- Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】
题目分析: 首先打个暴力求一下$10^9$以内因子最多的数的因子个数,发现只有$1344$个. 由于有$ax+by=k*(a,b)$和2017年noip的结论,所以我们可以发现对于任意多个数$a_1, ...
随机推荐
- Python之操作Excel
使用之前先导入三个模块: import xlwt #只能写Excel import xlrd #只能读Excel import xlutils #修改Excel,在原来的基础上修改 一.写EXCEL ...
- PHP安装pecl扩展--通用
虽然现在composer很流行,但是有时候,我们还是要安装pecl的扩展. pecl扩展可以在pecl.php.net中查看,想要什么扩展,可以去搜索,比如xdebug.siege.memcached ...
- JEECG框架中使用Flash版本Uploadify,在Chrome版本号70下无法启动的解决办法
感谢文章:https://www.cnblogs.com/zinan/p/6902427.html 单独打开IFRAME中的页面 点击导航栏的<不安全> 再刷新单独IFRAME的页面,就可 ...
- vsconsole
一.安装 npm install vconsole 二. if (process.env.NODE_ENV === `development`) { const { logger } = requir ...
- asp.net core认证和授权的初始认识--claim、claimsidentity、claimsprincipal
Claim表示一个声明单元,它用来组成ClaimsIdentity.ClaimsIdentity表示一个证件,例如身份证,身份证上面的名字表示一个Claim,身份证号也表示一个Claim,所有这些Cl ...
- 简单理解laravel框架中的服务容器,服务提供者以及怎样调用服务
laravel被称为最优雅的框架,最近正在学习中,对于用惯了thinkphp.ci框架的人来说,服务容器.服务提供者,依赖注入这些概念简直是一脸懵逼.我花了些时间梳理了一下,也不敢确定自己说的是对 ...
- HDU 3900 Unblock Me
题目:Unblock Me 链接:Here 题意:一个游戏,看图就基本知道题意了,特殊的是:1. 方块长度为3或2,宽度固定是1.2. 地图大小固定是6*6,从0开始. 3. 出口固定在(6,2).4 ...
- 2017年前小纪(有关http的一些缓存理论知识)
position的top和bottom的区别:前者基准点定在top,后者基准点定在bottom. for-in 遍历属性的顺序不确定 手机端,line-height对光标大小非常有影响 有些css3属 ...
- Golang的channel使用以及并发同步技巧
在学习<The Go Programming Language>第八章并发单元的时候还是遭遇了不少问题,和值得总结思考和记录的地方. 做一个类似于unix du命令的工具.但是阉割了一些功 ...
- 七、.net core下配置、数据库访问等操作实现
配置读取 .net core下读取配置还是有点麻烦的,本身没有System.Configuration.dll,所以在进行配置前需要自行引用Microsoft.Extensions.Configura ...