题解

复杂度怎么算也要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」奇怪的背包的更多相关文章

  1. LOJ#2552. 「CTSC2018」假面(期望 背包)

    题意 题目链接 Sol 多年以后,我终于把这题的暴力打出来了qwq 好感动啊.. 刚开始的时候想的是: 设\(f[i][j]\)表示第\(i\)轮, 第\(j\)个人血量的期望值 转移的时候若要淦这个 ...

  2. loj#2552. 「CTSC2018」假面

    题目链接 loj#2552. 「CTSC2018」假面 题解 本题严谨的证明了我菜的本质 对于砍人的操作好做找龙哥就好了,blood很少,每次暴力维护一下 对于操作1 设\(a_i\)为第i个人存活的 ...

  3. Loj #3102. 「JSOI2019」神经网络

    Loj #3102. 「JSOI2019」神经网络 题目背景 火星探险队发现,火星人的思维方式与人类非常不同,是因为他们拥有与人类很不一样的神经网络结构.为了更好地理解火星人的行为模式,JYY 对小镇 ...

  4. Loj #3045. 「ZJOI2019」开关

    Loj #3045. 「ZJOI2019」开关 题目描述 九条可怜是一个贪玩的女孩子. 这天,她和她的好朋友法海哥哥去玩密室逃脱.在他们面前的是 \(n\) 个开关,开始每个开关都是关闭的状态.要通过 ...

  5. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  7. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  8. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  9. Loj #2542. 「PKUWC2018」随机游走

    Loj #2542. 「PKUWC2018」随机游走 题目描述 给定一棵 \(n\) 个结点的树,你从点 \(x\) 出发,每次等概率随机选择一条与所在点相邻的边走过去. 有 \(Q\) 次询问,每次 ...

随机推荐

  1. MT【165】分段函数

    (2018浙江省赛12题改编)设$a\in R$,且对任意的实数$b$均有$\max\limits_{x\in[0,1]}|x^2+ax+b|\ge\dfrac{1}{4}$求$a$ 的范围. 提示: ...

  2. 普通平衡树Treap(含旋转)学习笔记

    浅谈普通平衡树Treap 平衡树,Treap=Tree+heap这是一个很形象的东西 我们要维护一棵树,它满足堆的性质和二叉查找树的性质(BST),这样的二叉树我们叫做平衡树 并且平衡树它的结构是接近 ...

  3. word 公式为图片

  4. 一文掌握Docker Compose

    目录 Docker Compose介绍 Docker Compose安装 Docker Compose基本示例 1.基本文件及目录设置 2.创建一个Dockerfile 3.通过docker-comp ...

  5. NodeJS 笔记 path模块

    path 模块,本模块包含一系列处理和转换文件路径的工具集. path.normalize(path)   normalize函数将不符合规范的路径经过格式化转换为标准路径,解析路径中的.与..外,还 ...

  6. Spark记录-Scala数组/List/Map/Set

    import Array._ import scala.collection.mutable.Set object DataStructure { def main(args:Array[String ...

  7. Codeforces Round #519 题解

    A. Elections 题意概述 给出 \(a_1, \ldots, a_n\),求最小的 \(k (k \ge \max a_i)\), 使得 \(\sum_{i=1}^n a_i < \s ...

  8. LaTeX字体设置

    % 导言区 % 帮助文档 texdoc lshort-zh % 设置normalsize大小 \documentclass[10pt]{ctexart} %article,ctexbook封面, ct ...

  9. ngx_lua_API 指令详解(六)ngx.thread.spawn、ngx.thread.wait、ngx.thread.kill介绍

    摘要:通过lua-nginx-module中的ngx.thread同时执行多个任务. ngx_lua中访问多个第三方服务 ngx_lua中提供了ngx.socket API,可以方便的访问第三方网络服 ...

  10. ActiveMQ Transport Connectors

    一,介绍 ActiveMQ的Transport Connectors 是什么? ActiveMQ是一个消息服务器.作为消息服务器,就会有生产者和消费者来使用它.生产者将消息发送给ActiveMQ,消费 ...