Luogu4495 [HAOI2018] 奇怪的背包 【扩展欧几里得算法】
题目分析:
首先打个暴力求一下$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] 奇怪的背包 【扩展欧几里得算法】相关推荐
- HDU1576 A/B【扩展欧几里得算法+试探法】
A/B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 扩展欧几里得算法_扩展欧几里得递推算法
欧几里得算法 表示 整数 a 与 b 的最大公约数. 若 t = a % b, 则 证明略. 递推版 gcd 算法 gcd 接受变量元组 (a, b) 作为输入,输出最大公约数 (r). 我们很难直接 ...
- 欧几里得算法扩展欧几里得算法
欧几里德算法又称辗转相除法,用于计算两个整数a,b的最大公约数. 基本算法:设a=qb+r,其中a,b,q,r都是整数,则gcd(a,b)=gcd(b,r),即gcd(a,b)=gcd(b,a%b). ...
- 如何利用扩展欧几里得算法求解不定方程_客户端不用的算法系列:从头条笔试题认识扩展欧几里得算法...
难度较高,阅读时间大概 28 分钟 这是数论的第二篇,在<素数筛法>中,我们重温了素数这个数学定义,并且给出了区别于教科书上更高效的 Eratosthenes 筛法和欧拉线性筛.这篇文会从 ...
- Codeforces 1106F Lunar New Year and a Recursive Sequence (数学、线性代数、线性递推、数论、BSGS、扩展欧几里得算法)...
Codeforces 1106F Lunar New Year and a Recursive Sequence (数学.线性代数.线性递推.数论.BSGS.扩展欧几里得算法) 哎呀大水题..我写了一 ...
- POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法)
POJ 1061 BZOJ 1477 Luogu P1516 青蛙的约会 (扩展欧几里得算法) 手动博客搬家: 本文发表于20180226 23:35:26, 原地址https://blog.csdn ...
- GCD LCM 欧几里得算法 扩展欧几里得算法
欧几里得算法: 辗转相除法的关键恒等式:gcd(a,b)=gcd(b,a mod b); 边界条件:gcd(a,0)=a; //最大公约数 int gcd(int a,int b) {return b ...
- 欧几里得算法和扩展欧几里得算法(Euclidean_Algorithm and Extended_Euclidean_Algorithm)
一.基本概念 欧几里得算法:又名辗转相除法,计算两个整数a,b的最大公约数. 扩展欧几里得算法:对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ...
- 2018/7/31 -zznu-oj -问题 C: 磨刀- 【扩展欧几里得算法的基本应用】
问题 C: 磨刀 时间限制: 1 Sec 内存限制: 128 MB 提交: 190 解决: 39 [提交] [状态] [讨论版] [命题人:admin] 题目描述 磨刀是一个讲究的工作,只能在n℃ ...
最新文章
- 作为一名合格的JAVA程序员需要点亮那些技能树?
- 中国金控(00875):林裕豪调任执行董事并获任首席执行官
- 无线网络连接无法停用
- OpenCASCADE绘制测试线束:图形命令之AIS 查看器——网格可视化服务
- ​用c语言打印自定义的乘法口诀表。例如:输入9,输出9*9口诀表,输入12,输出12*12的乘法口诀表。...
- Xshell显示中文,但是不能输入中文
- ubuntu12.04 使用gedit 打开txt文件中文乱码的处理方法
- java集合——具体的集合
- form表单元素设置只读
- 关于do{}while()的代码讨论
- 08 Django组件-Forms组件
- 【apache】phpstudy中apache 隐藏入口文件index.php (解决no input file specified错误)
- Jquery最常见的ajax写法
- Taro小程序分享功能
- 一个优秀的logo应该具备哪些特点?
- 【JAVA】-- 黄金矿工小游戏(二)(实现思路+每步代码)
- 小猪佩奇与Tom猫的一场内网友谊赛
- 动态域名解析服务器离线会引起什么_动态域名解析过程中可能出现的问题及解决方案...
- nginx 上传文件漏洞_浅谈文件上传漏洞(其他方式绕过总结)
- 搜狗输入法用户体验评价
热门文章
- PD连接远程mysql_PowerDesigner连接远程Oracle数据库 | 学步园
- android 调用 asp.net web api,从 .NET 客户端调用 Web API (C#)
- mysql8日志文件密码_mysql8 参考手册--mysqlbinlog-处理二进制日志文件的实用程序
- base6 python 字节_Python使用base64模块进行二进制数据编码详解
- mysql查询每日/某时间段/当日新增用户人数
- git命令提交本地代码到远程仓库
- Apollo开发平台授权管理的使用
- 2018四川高考文科21题
- SouceInsight 快捷方式查看与修改
- 集群节点列表编辑程序