正题

题目链接:https://www.luogu.com.cn/problem/P4495


题目大意

nnn个物品大小为viv_ivi​,每个物品有无数个,背包的重量定义为大小和%P\%P%P。

qqq次询问,问一个www表示有多少种取法使得背包重量为www(两种方案不同仅当有一种物品在其他方案种的是否选择不同,与选择数量无关)。


解题思路

对于一个物品viv_ivi​在%P\%P%P意义下可以视为一个gcd(vi,P)gcd(v_i,P)gcd(vi​,P)的物品。

然后同理对于两个物品a,ba,ba,b可以视为一个gcd(a,b,P)gcd(a,b,P)gcd(a,b,P)的物品,多个物品同理。

先筛出PPP的所有约数,设fif_ifi​表示现在的所有gcdgcdgcd为PPP的第iii个约数。然后如果kkk表示PPP的约数个数就可以O(k2log⁡k)O(k^2\log k)O(k2logk)进行dpdpdp。

然后对于一个询问www,如果能够拼出gcd(w,P)gcd(w,P)gcd(w,P)就可以拼出www,所有我们定义gig_igi​表示第iii个约数能够有多少种方法被拼出就好了。

时间复杂度O(k2log⁡k+qlog⁡k)O(k^2\log k+q\log k)O(k2logk+qlogk)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=4e4+10,XJQ=1e9+7;
ll n,q,P,cnt,d[N],v[N],g[N],f[N];
int main()
{scanf("%lld%lld%lld",&n,&q,&P);for(ll i=1;i*i<=P;i++){if(P%i==0)d[++cnt]=i;if(P%i==0&&i*i!=P)d[++cnt]=P/i;}sort(d+1,d+1+cnt);for(ll i=1;i<=cnt;i++)v[i]=1;for(ll i=1;i<=n;i++){ll x;scanf("%lld",&x);x=lower_bound(d+1,d+1+cnt,__gcd(x,P))-d;v[x]=v[x]*2%XJQ;}f[cnt]=1;for(ll i=1;i<=cnt;i++){if(!v[i])continue;v[i]=(v[i]-1+XJQ)%XJQ;for(ll j=1;j<=cnt;j++){ll k=__gcd(d[j],d[i]);k=lower_bound(d+1,d+1+cnt,k)-d;(f[k]+=f[j]*v[i]%XJQ)%=XJQ;}}for(ll i=1;i<=cnt;i++)for(ll j=1;j<=i;j++)(g[i]+=f[j]*(d[i]%d[j]==0))%=XJQ;while(q--){scanf("%lld",&n);n=__gcd(n,P);n=lower_bound(d+1,d+1+cnt,n)-d;printf("%lld\n",g[n]);}
}

P4495-[HAOI2018]奇怪的背包【数论,dp】相关推荐

  1. 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_ ...

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

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

  3. 洛谷P4495 奇怪的背包 [HAOI2018] 数论

    正解:数论+dp 解题报告: 传送门! 首先看到这题,跳无数次,自然而然可以想到之前考过好几次了的一个结论--如果只考虑无限放置i,它可以且仅可以跳到gcd(p,v[i]) 举一反三一下,如果有多个i ...

  4. 古有陈天华万字血书抗沙俄,今有本剧蒻万字背包虐dp(01,完全,多重,分组,混合等各种背包详解 + 板子题+ 奇奇怪怪滴变式题)

    前言: 本文介绍了01背包.完全背包.多重背包.混合背包.分组背包等背包,并对其进行透彻的剖析,并附上了板子题,供您白嫖,以及一些奇葩变式,颇有意思,供你琢磨玩弄.此外绝大部分题都有二维数组和滚动数组 ...

  5. USACO4.12Beef McNuggets(背包+数论)

    昨天晚上写的一题 结果USACO一直挂中 今天交了下 有一点点的数论知识  背包很好想 就是不好确定上界 官方题解: 这是一个背包问题.一般使用动态规划求解. 一种具体的实现是:用一个线性表储存所有的 ...

  6. 【题解】洛谷P1541 [NOIP2010TG] 乌龟棋(类似背包的DP)

    题目来源:洛谷P1541 思路 类似背包的题 总之就是四种卡牌取的先后顺序不同导致的最终ans不同 所以我们用一个四维数组每一维分别表示第几种取了几张的最大分数 然后就是简单DP解决 代码 #incl ...

  7. P1537 弹珠 背包可行性dp

    传送门 文章目录 题意: 思路: 题意: 思路: 疯狂水文章. 这个很明显是个背包,我们开一个布尔数组,之后枚举每组的个数,让后枚举1−61-61−6,再枚举容量kkk,注意顺序不能错了,让后或一下就 ...

  8. 【HDU - 1561】The more, The Better(树形背包,dp,依赖背包问题与空间优化,tricks)

    题干: ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城 ...

  9. 【POJ - 2486】Apple Tree (树形背包,dp)

    题干: Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There ...

最新文章

  1. 参加软件测试培训需要注意哪些
  2. java 连接 pgsql
  3. python 拆分excel工作表_Python将一个Excel拆分为多个Excel
  4. python中continue格式_python自学(3)--for 、 while、 break、continue、字符格式化输出...
  5. 前端和后端的英文_前端工程师一般都喜欢去哪些网站逛?
  6. 操作键盘事件源码解析(常用的鼠标事件、 键盘事件对象之keyCode属性)
  7. 使用layui实现后台数据表格显示时的需要修改的地方(包括后台)
  8. {基于Applet的J2ME模拟器}和{microemulator}[J2ME推荐]
  9. 我国无线2.4g及5g信道-个人笔记
  10. 该死!B 站上这些 Java 视频真香!
  11. 555定时器产生对称三角波电路
  12. BSS,ESS,SSID,BSSID,ESSID,VAP概念详解
  13. 整理归纳:《一课经济学》—— 只见树木不见森林
  14. 汉诺塔问题模拟实现代码
  15. java字符串去重复_java去除重复的字符串和移除不想要的字符串
  16. 如何实现Word、PDF、TXT文件的全文内容检索?
  17. 【Visual C++】游戏开发笔记十二 游戏输入消息处理(一) 键盘消息处理
  18. 用Matlab录制、读取音频
  19. 手机PIN、PUK码之谜
  20. ​PC电脑流行的主要原因

热门文章

  1. 为什么电脑不能打字_嘉兴在线丨「生活经济学」为什么笔记本电脑能在任何国家的供电标准下运作,其他大部分电器却不能?...
  2. mysql slave 1032_修复mysql slave复制1032错误
  3. oracle经常开关好吗,频繁开关机对电脑有什么影响吗?
  4. linux调用odbc接口乱码,linux中pypyodbc读取GB编码mdb中文乱码解决办法
  5. python中log1p用法_python中logging模块的基本用法
  6. php xlsx格式转换csv,我想使用C将.xls或.xlsx文件转换为.csv格式#
  7. 自动控制原理第二版王建辉_王建辉自动控制原理配套题库名校考研真题课后答案资料课后习题章节题库模拟试题...
  8. target not created怎么解决_怎么才能最短时、高效、踏实地学习 Python(附链接)...
  9. 算法---宝藏最优选择问题
  10. seaborn.heatmap概述