题目分析:

首先打个暴力求一下$10^9$以内因子最多的数的因子个数,发现只有$1344$个。

由于有$ax+by=k*(a,b)$和2017年noip的结论,所以我们可以发现对于任意多个数$a_1,a_2,a_3,...,a_n$他们能组成的数是$k$倍的最大公约数,$k$任取。我们发现如果$gcd%p$不是$w$的因子那么不行,否则可行。所以把$a$数组全部模$p$,再归类为每个因子,再处理相互之间能构建出来的$gcd$,再用莫比乌斯函数做一下容斥,再处理出每个因子的因子和,再对每个输入的$w$模$p$,答案可以$O(1)$回答。

代码:

 #include<bits/stdc++.h>
using namespace std; const int maxn = ;
const int MXF = ;
const int mod = 1e9+; int n,q,p;
int fac[MXF],dt[MXF],num;
int a[maxn],chs[MXF],mu[MXF];
int pw2[maxn]; int gcd(int a,int b){
if(!b) return a;
else return gcd(b,a%b);
} void divide(){
for(int i=;i*i<=p;i++){
if(p%i) continue;
if(i*i == p) fac[++num] = i;
else{
fac[++num] = i;
fac[++num] = p/i;
}
}
sort(fac+,fac+num+);
} void read(){
scanf("%d%d%d",&n,&q,&p);
divide();
for(int i=;i<=n;i++) scanf("%d",&a[i]),a[i] = gcd(a[i],p);
for(int i=;i<=n;i++){
int z = lower_bound(fac+,fac+num+,a[i])-fac;
dt[z]++;
}
for(int i=;i<=num;i++){
int hh = fac[i]; mu[i] = ;
for(int j=;j*j<=hh;j++){
int cnt = ;
while(hh % j == ) cnt++,hh/=j;
if(cnt > )mu[i] = ;
else if(cnt) mu[i] = 1ll*mu[i]*(mod-)%mod;
}
if(hh != ){mu[i] = 1ll*mu[i]*(mod-)%mod;}
}
} void work(){
pw2[] = ; for(int i=;i<=n;i++) pw2[i] = pw2[i-]*%mod;
for(int i=;i<=num;i++){
int z = ;
for(int j=i;j<=num;j++){
if(fac[j] % fac[i] == ) z+=dt[j];
}
chs[i] = (pw2[z]-)%mod;
}
for(int i=;i<=num;i++){
for(int j=i+;j<=num;j++){
if(fac[j] % fac[i]) continue;
int ct = lower_bound(fac+,fac+num+,fac[j]/fac[i])-fac;
chs[i] = chs[i]+1ll*mu[ct]*chs[j]%mod; chs[i] %= mod;
}
}
for(int i=num;i>=;i--){
for(int j=;j<i;j++){
if(fac[i] % fac[j] == ) chs[i] += chs[j],chs[i] %= mod;
}
}
for(int i=;i<=q;i++){
int x; scanf("%d",&x); x = gcd(x,p);
x = lower_bound(fac+,fac+num+,x)-fac;
printf("%d\n",chs[x]);
}
} int main(){
read();
work();
return ;
}

Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】的更多相关文章

  1. noip知识点总结之--欧几里得算法和扩展欧几里得算法

    一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a  ...

  2. 扩展欧几里得算法(extgcd)

    相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...

  3. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  4. vijos1009:扩展欧几里得算法

    1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...

  5. ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)

    1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...

  6. 浅谈扩展欧几里得算法(exgcd)

    在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...

  7. (light oj 1306) Solutions to an Equation 扩展欧几里得算法

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...

  8. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  9. 【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)

    [BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\ ...

随机推荐

  1. [Flashback]开启数据库闪回数据库功能

    Flashback是Oracle中一个重要的功能,想要使用闪回数据库功能,需要将数据库置于闪回数据库的状态. 1.检查数据库是否开启归档状态 SQL> archive log list; Dat ...

  2. 剑指前端(前端入门笔记)——Date类型

    Date类型 ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的.为此,Date类型使用自UTC(国际协调时间)1970年1月1日午夜(零时)开始经过的 ...

  3. Dart语言入门(一)

    Dart 语言介绍 Dart 是谷歌在 2011 年推出的编程语言,是一种结构化 Web 编程语言,允许用户通过 Chromium 中所整合的虚拟机(Dart VM)直接运行 Dart 语言编写的程序 ...

  4. 关于写作那些事之利用 js 统计各大博客阅读量

    在日常文章数据统计的过程中,纯手动方式已经难以应付,于是乎,逐步开始了程序介入方式进行统计. 在上一节中,探索利用 csv 文件格式进行文章数据统计,本来以为能够应付一阵子,没想到仅仅一天我就放弃了. ...

  5. DVWA 黑客攻防演练(十一) 存储型 XSS 攻击 Stored Cross Site Scripting

    上一篇文章会介绍了反射型 XSS 攻击.本文主要是通过 dvwa 介绍存储型 XSS 攻击.存储型 XSS 攻击影响范围极大.比如是微博.贴吧之类的,若有注入漏洞,再假如攻击者能用上一篇文章类似的代码 ...

  6. windows已激活,但提示:windows 7 内部版本7601 此windows副本不是正版

    把三个服务改为自动:

  7. 从0开始的Python学习019更多的Python内容2

    书接上文,接演Python全传 话说学了这么多Python的基础知识,也该写一点让别人看不懂的代码了. lambda lambda表达式,是一个方法的简化形似,它没有自己的代码块,它后面的语句就是它的 ...

  8. js 学习之路10:try异常处理和第一个js小程序

    try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. 1. try/catch语句 catch语句用来捕获try代码块中的错误,并执行自定义的语句来处理它. 语 ...

  9. vim常用命令集

    vim是vi的增强版. 这里记录下使用vim时查过的那些指令. 以备不时之需. 30j 向下移动30行 shitf + g 直接跳到文件的末尾 gg 跳回文件头 ggyG 复制全文 查找字符串 普通模 ...

  10. 04 前端篇(JQuery)

    jquery: http://www.cnblogs.com/yuanchenqi/articles/5663118.html 优点:简洁.兼容 jquery 对象:   jQuery 或  $ 基本 ...