题目分析:

首先打个暴力求一下$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)$回答。

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 1050000;
 5 const int MXF = 1350;
 6 const int mod = 1e9+7;
 7
 8 int n,q,p;
 9 int fac[MXF],dt[MXF],num;
10 int a[maxn],chs[MXF],mu[MXF];
11 int pw2[maxn];
12
13 int gcd(int a,int b){
14     if(!b) return a;
15     else return gcd(b,a%b);
16 }
17
18 void divide(){
19     for(int i=1;i*i<=p;i++){
20     if(p%i) continue;
21     if(i*i == p) fac[++num] = i;
22     else{
23         fac[++num] = i;
24         fac[++num] = p/i;
25     }
26     }
27     sort(fac+1,fac+num+1);
28 }
29
30 void read(){
31     scanf("%d%d%d",&n,&q,&p);
32     divide();
33     for(int i=1;i<=n;i++) scanf("%d",&a[i]),a[i] = gcd(a[i],p);
34     for(int i=1;i<=n;i++){
35     int z = lower_bound(fac+1,fac+num+1,a[i])-fac;
36     dt[z]++;
37     }
38     for(int i=1;i<=num;i++){
39     int hh = fac[i]; mu[i] = 1;
40     for(int j=2;j*j<=hh;j++){
41         int cnt = 0;
42         while(hh % j == 0) cnt++,hh/=j;
43         if(cnt > 1)mu[i] = 0;
44         else if(cnt) mu[i] = 1ll*mu[i]*(mod-1)%mod;
45     }
46     if(hh != 1){mu[i] = 1ll*mu[i]*(mod-1)%mod;}
47     }
48 }
49
50 void work(){
51     pw2[0] = 1; for(int i=1;i<=n;i++) pw2[i] = pw2[i-1]*2%mod;
52     for(int i=1;i<=num;i++){
53     int z = 0;
54     for(int j=i;j<=num;j++){
55         if(fac[j] % fac[i] == 0) z+=dt[j];
56     }
57     chs[i] = (pw2[z]-1)%mod;
58     }
59     for(int i=1;i<=num;i++){
60     for(int j=i+1;j<=num;j++){
61         if(fac[j] % fac[i]) continue;
62         int ct = lower_bound(fac+1,fac+num+1,fac[j]/fac[i])-fac;
63         chs[i] = chs[i]+1ll*mu[ct]*chs[j]%mod; chs[i] %= mod;
64     }
65     }
66     for(int i=num;i>=1;i--){
67     for(int j=1;j<i;j++){
68         if(fac[i] % fac[j] == 0) chs[i] += chs[j],chs[i] %= mod;
69     }
70     }
71     for(int i=1;i<=q;i++){
72     int x; scanf("%d",&x); x = gcd(x,p);
73     x = lower_bound(fac+1,fac+num+1,x)-fac;
74     printf("%d\n",chs[x]);
75     }
76 }
77
78 int main(){
79     read();
80     work();
81     return 0;
82 }

转载于:https://www.cnblogs.com/Menhera/p/10514800.html

Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】相关推荐

  1. HDU1576 A/B【扩展欧几里得算法+试探法】

    A/B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  2. 扩展欧几里得算法_扩展欧几里得递推算法

    欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...

  3. 欧几里得算法扩展欧几里得算法

    欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...

  4. 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...

    难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...

  5. Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...

    Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...

  6. POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)

    POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...

  7. GCD LCM 欧几里得算法 扩展欧几里得算法

    欧几里得算法: 辗转相除法的关键恒等式:gcd(a,b)=gcd(b,a mod b); 边界条件:gcd(a,0)=a; //最大公约数 int gcd(int a,int b) {return b ...

  8. 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)

    一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...

  9. 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】

    问题 C: 磨刀 时间限制: 1 Sec  内存限制: 128 MB 提交: 190  解决: 39 [提交] [状态] [讨论版] [命题人:admin] 题目描述 磨刀是一个讲究的工作,只能在n℃ ...

最新文章

  1. 作为一名合格的JAVA程序员需要点亮那些技能树?
  2. 中国金控(00875):林裕豪调任执行董事并获任首席执行官
  3. 无线网络连接无法停用
  4. OpenCASCADE绘制测试线束:图形命令之AIS 查看器——网格可视化服务
  5. ​用c语言打印自定义的乘法口诀表。例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。...
  6. Xshell显示中文,但是不能输入中文
  7. ubuntu12.04 使用gedit 打开txt文件中文乱码的处理方法
  8. java集合——具体的集合
  9. form表单元素设置只读
  10. 关于do{}while()的代码讨论
  11. 08 Django组件-Forms组件
  12. 【apache】phpstudy中apache 隐藏入口文件index.php (解决no input file specified错误)
  13. Jquery最常见的ajax写法
  14. Taro小程序分享功能
  15. 一个优秀的logo应该具备哪些特点?
  16. 【JAVA】-- 黄金矿工小游戏(二)(实现思路+每步代码)
  17. 小猪佩奇与Tom猫的一场内网友谊赛
  18. 动态域名解析服务器离线会引起什么_动态域名解析过程中可能出现的问题及解决方案...
  19. nginx 上传文件漏洞_浅谈文件上传漏洞(其他方式绕过总结)
  20. 搜狗输入法用户体验评价

热门文章

  1. PD连接远程mysql_PowerDesigner连接远程Oracle数据库 | 学步园
  2. android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)
  3. mysql8日志文件密码_mysql8 参考手册--mysqlbinlog-处理二进制日志文件的实用程序
  4. base6 python 字节_Python使用base64模块进行二进制数据编码详解
  5. mysql查询每日/某时间段/当日新增用户人数
  6. git命令提交本地代码到远程仓库
  7. Apollo开发平台授权管理的使用
  8. 2018四川高考文科21题
  9. SouceInsight 快捷方式查看与修改
  10. 集群节点列表编辑程序