【LOJ】#2523. 「HAOI2018」奇怪的背包
题解
复杂度怎么算也要2s的题怎么0.5s就跑完了,迷啊
这个题简直算完复杂度不敢写,写了就赚飞了好吧
根据裴蜀定理,显然选出的数和P的gcd是w的约数
我们考虑枚举\(P\)的约数,上限当然是\(\sqrt{P}\)个,写个暴力搜一下发现最多也就13000个左右
然后我们把每个数处理成\(gcd(a_i,P)\)
重标号所有约数
那么我们写个\(n^2\)的\(dp[i][j]\)表示处理到第\(i\)个约数,然后这些数的\(gcd\)是第\(j\)个约数
然后再\(n^2\)将\(val[j]\)的约数\(val[i]\)的\(dp[tot][i]\)累加进\(ans[j]\)里
查询的时候看看\(gcd(w_i,P)\)是哪个约数就行
代码
#include <bits/stdc++.h>
#define fi first
#define se second
#define pii pair<int,int>
#define pdi pair<db,int>
#define mp make_pair
#define pb push_back
#define enter putchar('\n')
#define space putchar(' ')
#define eps 1e-8
#define MAXN 100005
#define mo 974711
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int MOD = 1000000007;
int inc(int a,int b) {
return a + b >= MOD ? a + b - MOD : a + b;
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
int update(int &x,int y) {
x = inc(x,y);
}
int N,Q,P;
struct node {
int x,num,next;
}E[100005];
int head[mo + 5],sumE,val[13005],tot,pw[1000005],cnt[13005];
int f[2][13005],ans[13005];
void add(int x,int y) {
int u = x % mo;
E[++sumE].x = x;
E[sumE].num = y;
E[sumE].next = head[u];
head[u] = sumE;
}
int Query(int x) {
int u = x % mo;
for(int i = head[u] ; i ; i = E[i].next) {
if(E[i].x == x) return E[i].num;
}
}
int gcd(int a,int b) {
return b == 0 ? a : gcd(b,a % b);
}
void Init() {
read(N);read(Q);read(P);
for(int i = 1 ; i <= P / i ; ++i) {
if(P % i == 0) {
val[++tot] = i;
if(i != P / i) val[++tot] = P / i;
}
}
sort(val + 1,val + tot + 1);
for(int i = 1 ; i <= tot ; ++i) add(val[i],i);
pw[0] = 1;
int a;
for(int i = 1 ; i <= N ; ++i) {
pw[i] = mul(pw[i - 1],2);
read(a);cnt[Query(gcd(a,P))]++;
}
}
void Solve() {
int cur = 0;
f[cur][Query(P)] = 1;
for(int i = 1 ; i <= tot ; ++i) {
if(!cnt[i]) continue;
memset(f[cur ^ 1],0,sizeof(f[cur ^ 1]));
for(int j = 1 ; j <= tot ; ++j) {
update(f[cur ^ 1][Query(gcd(val[i],val[j]))],mul(f[cur][j],pw[cnt[i]] - 1));
update(f[cur ^ 1][j],f[cur][j]);
}
cur ^= 1;
}
for(int i = 1 ; i <= tot ; ++i) {
for(int j = 1 ; j <= i ; ++j) {
if(val[i] % val[j] == 0) update(ans[i],f[cur][j]);
}
}
int w;
for(int i = 1 ; i <= Q ; ++i) {
read(w);
out(ans[Query(gcd(w,P))]);enter;
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}
【LOJ】#2523. 「HAOI2018」奇怪的背包的更多相关文章
- LOJ#2552. 「CTSC2018」假面(期望 背包)
题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...
- loj#2552. 「CTSC2018」假面
题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...
- Loj #3102. 「JSOI2019」神经网络
Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...
- Loj #3045. 「ZJOI2019」开关
Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #2542. 「PKUWC2018」随机游走
Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...
随机推荐
- 【题解】 bzoj1190: [HNOI2007]梦幻岛宝珠 (动态规划)
bzoj1190,懒得复制,戳我戳我 Solution: 这道题其实是一个背包(分组背包),但是由于数字比较大,就要重新构造dp式子.啃了三天才懂. \(dp[i][j]\)表示背包容积为\(j*2^ ...
- MySQL删除数据库时的错误(errno: 39)
由于mysql数据库是默认区分大小写的,部署的时候发现多了一些重复的表,于是就把多余的表删掉了.可是,剩下的重复的表再删除时会提示:表不存在. 于是,想把数据库删掉重新创建,可是,得到了 ERROR ...
- USACO Section 2.1 The Castle 解题报告
题目 题目描述 有一个城堡,城堡中有若干个房间,房间与房间之间用墙来进行分隔.现在我们需要统计这个城堡有多少个房间,并且还要找出最大的房间的面积是多少(一个单元格就代表一个单元面积).城堡的主人现在想 ...
- luogu3778/bzoj4898 商旅 (floyd+分数规划+spfa)
首先floyd求出来每两点间的最短距离,然后再求出来从某点买再到某点卖的最大收益 问题就变成了找到一个和的比值最大的环 所以做分数规划,二分出来那个答案r,把边权变成w[i]-r*l[i],再做spf ...
- [学习笔记]Cayley-Hilmiton
Cayley–Hamilton theorem - Wikipedia 其实不是理解很透彻,,,先写上 简而言之: 是一个知道递推式,快速求第n项的方法 k比较小的时候可以用矩阵乘法 k是2000,n ...
- 命令行 设置redis 时间
> set name jack OK > expire jack (integer) > ttl jack (integer) - > expire name (integer ...
- mysql concat_ws 与 concat 多字段模糊匹配应用
有时我们希望在表中多个字段检索是否有我们给出的关键字,我们可以使用 concat_ws 和 concat 连接需要检索的字段,如: select * from userInfo where conca ...
- SQL记录-PLSQL日期与时间
PL/SQL日期及时间 PL/SQL提供两个日期和时间相关的数据类型: 日期时间(Datetime)数据类型 间隔数据类型 datetime数据类型有: DATE TIMESTAMP TIMESTAM ...
- Github 开源项目(二) jsmpeg-vnc
参考文章:http://blog.csdn.net/qq_28877125/article/details/70141713 适用于Windows的低延迟,高帧率屏幕共享服务器以及用于浏览器的客户端 ...
- 阿里云Tengine和Openresty/1.11.2.3 数据对比
HLS播放延迟测试:阿里云48s ,openresy 31s Cache-Control: max-age=300 NGINX下配置CACHE-CONTROL Content-Length:637 ...