P4495 [HAOI2018]奇怪的背包

题目描述

小\(C\)非常擅长背包问题,他有一个奇怪的背包,这个背包有一个参数\(P\),当他 向这个背包内放入若干个物品后,背包的重量是物品总体积对\(P\)取模后的结果. 现在小\(C\)有\(n\)种体积不同的物品,第\(i\)种占用体积为\(V_i\),每种物品都有无限个. 他会进行\(q\)次询问,每次询问给出重量\(w_i\),你需要回答有多少种放入物品的方案,能将一个初始为空的背包的重量变为\(w_i\).注意,两种方案被认为是不同的, 当且仅当放入物品的种类不同,而与每种物品放入的个数无关.不难发现总的方案数为\(2^n\). 由于答案可能很大,你只需要输出答案对\(1e9+7\)取模的结果.

输入输出格式

输入格式

第一行三个整数\(n,q,P\),含义见问题描述. 接下来一行\(n\)个整数表示\(V_i\). 接下来一行\(q\)个整数表示\(w_i\).

输出格式:

输出\(q\)行,每行一个整数表示答案.

说明

对于所有数据,有\(1\le n,q\le 10^6,3 \le P \le 10^9,0 < V_i,w_i < P\),保证\(V_i\)两两不同。

测试点标号 \(n\) \(q\) \(p\)
\(1\) \(=1\) \(\le 10^3\) \(\le 10^9\)
\(2\) \(\le 10\) \(\le 10^3\) \(\le 10\)
\(3\) \(\le 10\) \(\le 10^3\) \(\le 250\)
\(4\) \(\le 10\) \(\le 10^3\) \(\le 250\)
\(5\) \(\le 10^3\) \(\le 10^3\) \(\le 10^4\)
\(6\) \(\le 10^3\) \(\le 10^3\) \(\le 10^4\)
\(7\) \(\le 10^3\) \(\le 10^3\) \(=998244353\)
\(8\) \(\le 10^3\) \(\le 10^3\) \(\le 10^9\)
\(9\) \(\le 10^6\) \(\le 10^6\) \(\le 10^9\)
\(10\) \(\le 10^6\) \(\le 10^6\) \(\le 10^9\)

是什么限制了我做题的想象力。。

我们要求

\[\sum x_ia_i \equiv w_i \pmod p
\]

有多少个解,换成方程,即

\[\sum x_ia_i -py =w_i
\]

有裴蜀定理可以猜到,有解的要求是\(gcd(x_1,x_2,\dots,x_n,p)|w_i\)

于是我们可以做\(DP\),令\(dp_{i,j}\)表示前\(i\)个数选择的数的\(gcd\)和\(p\)做\(gcd\)后的结果为\(j\)

发现这样的状态是\(O(nd(p))\)的,\(d(p)\)表示\(p\)的约数个数

我们可以把\(V_i\)与\(p\)的\(gcd\)相同的放在一起做,这样状态就优化到了\(O(d^2(p))\)了

转移的时候要求\(gcd\),那么\(dp\)的总复杂度就是\(O(d^2(p)\log p)\)的

最后对每个\(w_i\)统计答案是\(\sum_{i|w_i}dp_{n,i}\),不可以暴力统计,注意到是可以实现预处理的。

总复杂度\(O(\sqrt p+d^2(p)\log p+n\log p+q)\)的


Code:

#include <cstdio>
#include <algorithm>
#define ll long long
const int N=1e6+10;
const int M=2010;
const ll mod=1e9+7;
int n_,n,q,p,v[N],siz[N],cnt;
ll dp[M][M],f[M],d[M],po[N];
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int Find(int x){return std::lower_bound(d+1,d+1+cnt,x)-d;}
int main()
{
scanf("%d%d%d",&n_,&q,&p);
po[0]=1;
for(int i=1;i<=n_;i++)
{
scanf("%d",v+i);
v[i]=gcd(v[i],p);
po[i]=(po[i-1]<<1ll)%mod;
}
std::sort(v+1,v+1+n_);
for(int i=1;i<=n_;i++)
{
if(v[i]==v[n])
++siz[n];
else
v[++n]=v[i],siz[n]=1;
}
for(int i=1;i*i<=p;i++)
if(p%i==0)
d[++cnt]=p/i,d[++cnt]=i;
std::sort(d+1,d+1+cnt);
cnt=std::unique(d+1,d+1+cnt)-d-1;
for(int i=0;i<n;i++)
{
for(int j=1;j<=cnt;j++)
{
int pos=Find(gcd(v[i+1],d[j]));
(dp[i+1][pos]+=dp[i][j]*(po[siz[i+1]]-1)%mod)%=mod;
(dp[i+1][j]+=dp[i][j])%=mod;
}
(dp[i+1][Find(gcd(v[i+1],p))]+=po[siz[i+1]]-1)%=mod;
}
for(int i=1;i<=cnt;i++)
for(int j=1;j<=i;j++)
if(d[i]%d[j]==0)
(f[i]+=dp[n][j])%=mod;
for(int w,i=1;i<=q;i++)
{
scanf("%d",&w);
printf("%lld\n",f[Find(gcd(w,p))]);
}
return 0;
}

2018.10.31

洛谷 P4495 [HAOI2018]奇怪的背包 解题报告的更多相关文章

  1. 洛谷P4495 [HAOI2018]奇怪的背包(数论)

    题面 传送门 题解 好神仙的思路啊--orzyyb 因为不限次数,所以一个体积为\(V_i\)的物品可以表示出所有重量为\(\gcd(V_i,P)\)的倍数的物品,而所有物品的总和就是这些所有的\(\ ...

  2. 洛谷 P4389 付公主的背包 解题报告

    P4389 付公主的背包 题目背景 付公主有一个可爱的背包qwq 题目描述 这个背包最多可以装\(10^5\)大小的东西 付公主有\(n\)种商品,她要准备出摊了 每种商品体积为\(V_i\),都有\ ...

  3. 洛谷 P2323 [HNOI2006]公路修建问题 解题报告

    P2323 [HNOI2006]公路修建问题 题目描述 输入输出格式 输入格式: 在实际评测时,将只会有m-1行公路 输出格式: 思路: 二分答案 然后把每条能加的大边都加上,然后加小边 但在洛谷的题 ...

  4. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

  5. 洛谷 P1356 数列的整数性 解题报告

    P1356 数列的整数性 题目描述 对于任意一个整数数列,我们可以在每两个整数中间任意放一个符号'+'或'-',这样就可以构成一个表达式,也就可以计算出表达式的值.比如,现在有一个整数数列:17,5, ...

  6. 洛谷 P2114 [NOI2014]起床困难综合症 解题报告

    P2114 [NOI2014]起床困难综合症 题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作 ...

  7. 洛谷 P3299 [SDOI2013]保护出题人 解题报告

    P3299 [SDOI2013]保护出题人 题目描述 出题人铭铭认为给SDOI2012出题太可怕了,因为总要被骂,于是他又给SDOI2013出题了. 参加SDOI2012的小朋友们释放出大量的僵尸,企 ...

  8. 洛谷 P2059 [JLOI2013]卡牌游戏 解题报告

    P2059 [JLOI2013]卡牌游戏 题意 有\(n\)个人玩约瑟夫游戏,有\(m\)张卡,每张卡上有一个正整数,每次庄家有放回的抽一张卡,干掉从庄家起顺时针的第\(k\)个人(计算庄家),干掉的 ...

  9. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

随机推荐

  1. JAVA FILE.renameTo跨文件系统移动文件失败

    遇到了FILE.renameTo跨文件系统移动文件失败的问题,应使用FILES.move()接口或在同一文件系统移动文件. FILE.renameTo接口说明: public boolean rena ...

  2. 微信小程序—day05

    小程序云服务器--环境配置 本来想要买腾讯云的云服务器,作为小程序的服务端的.无奈,腾讯云卖的太贵了,比阿里云要贵一倍,想想还是算了. 但是,没有服务端的接受,小程序的一些功能是实现不了的.找了一圈, ...

  3. Qt-QML-QML调用C++类

    QML用来做界面,在不考虑数据的请款下,那是溜溜的,但是,程序是没有不和后台数据交互的,但是了,QML在数据处理方面的效率又是不敢恭维的,这里就出现了QML负责前端界面,而后端使用JS或者C++了. ...

  4. Java学习 · 初识 面向对象深入一

    面向对象深入 1.面向对象三大特征 a) 继承 inheritance 子类可以从父类继承属性和方法 子类可以提供自己的属性方法 b) 封装 encapsulation 对外隐藏某些属性和方法 对外公 ...

  5. NHibernate3快速上手教程FluentNHibernate配置与DBHelper(已过期,有更好的)

    很多学习NHibernate的新手很容易卡在配置文件这一关,正所谓万事开头难,上手后再配合官方文档就比较容易了. 网上关于配置文件的资料非常多,但由于版本的问题,许多老的教程中都没有明确指出类库的版本 ...

  6. pymsql报错:UnicodeEncodeError: 'latin-1' codec can't encode characters End,OK!!

    UnicodeEncodeError: 'latin-1' codec can't encode characters的做法基本一致,后来发现是因为使用的是mysqldb,照着网上的方法修改配置应该可 ...

  7. 十三:Transparent Encryption in HDFS(转)

    透明加密:http://blog.csdn.net/linlinv3/article/details/44963429 hadoop透明加密  kms 简介      Hadoop Key Manag ...

  8. defineporperty 的使用 设置对象的只读或只写属性

    <!DOCTYPE html> <html lang="en"> <head> <title>Document</title& ...

  9. 软工Hello World!团队第二周博客汇总

    2017.10.20-2017.10.26 Scrum会议: 第一天:http://www.cnblogs.com/liusx0303/p/7704482.html 第二天:http://www.cn ...

  10. Thunder团队第三周 - Scrum会议6

    Scrum会议6 小组名称:Thunder 项目名称:i阅app Scrum Master:宋雨 工作照片: 代秋彤照相,所以图片中没有该同学. 参会成员: 王航:http://www.cnblogs ...