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)$回答。
代码:
#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] 奇怪的背包 【扩展欧几里得算法】的更多相关文章
- noip知识点总结之--欧几里得算法和扩展欧几里得算法
一.欧几里得算法 名字非常高大上的不一定难,比如欧几里得算法...其实就是求两个正整数a, b的最大公约数(即gcd),亦称辗转相除法 需要先知道一个定理: gcd(a, b) = gcd(b, a ...
- 扩展欧几里得算法(extgcd)
相信大家对欧几里得算法,即辗转相除法不陌生吧. 代码如下: int gcd(int a, int b){ return !b ? gcd(b, a % b) : a; } 而扩展欧几里得算法,顾名思义 ...
- 欧几里得算法与扩展欧几里得算法_C++
先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...
- vijos1009:扩展欧几里得算法
1009:数论 扩展欧几里得算法 其实自己对扩展欧几里得算法一直很不熟悉...应该是因为之前不太理解的缘故吧这次再次思考,回看了某位大神的推导以及某位大神的模板应该算是有所领悟了 首先根据题意:L1= ...
- ****ural 1141. RSA Attack(RSA加密,扩展欧几里得算法)
1141. RSA Attack Time limit: 1.0 secondMemory limit: 64 MB The RSA problem is the following: given a ...
- 浅谈扩展欧几里得算法(exgcd)
在讲解扩展欧几里得之前我们先回顾下辗转相除法: \(gcd(a,b)=gcd(b,a\%b)\)当a%b==0的时候b即为所求最大公约数 好了切入正题: 简单地来说exgcd函数求解的是\(ax+by ...
- (light oj 1306) Solutions to an Equation 扩展欧几里得算法
题目链接:http://lightoj.com/volume_showproblem.php?problem=1306 You have to find the number of solutions ...
- 『扩展欧几里得算法 Extended Euclid』
Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...
- 【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)
[BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\ ...
随机推荐
- c# 制作正方形图片
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D ...
- 网页三剑客:HTML+CSS+JavaScript 之JavaScript
JavaScript 简介 JavaScript 是互联网上最流行的脚本语言,这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. JavaScrip ...
- 基于python的种子搜索网站-项目部署
本讲会对种子搜索网站的部署过程进行详细的讲解. 网站演示: https://bt.mypython.me 源码地址: https://github.com/geeeeeeeek/bt 项目部署过程 系 ...
- webstorm 2018.2.3 cmd+w无法关闭文件
- Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?
Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...
- android 权限库EasyPermissions
文章链接:https://mp.weixin.qq.com/s/H63Sn03xV0JoINXB4SWWKA 众所周知,在android 6.0之后,如果应用程序需要危险权限,则用户必须明确向应用授予 ...
- Android为TV端助力:intent传递消息
我们都知道一个activity向另外一个activity传递消息可以用intent来传递 现在需求如下,一个不断接收消息服务的service,一个收到消息进行处理的activity service第一 ...
- 业务与IT技术
最近听一个同事又再次提问关于业务比技术重要,是真的吗? 今天我们再来看一下. 一,什么是业务? 业务意指某种有目的的工作或工作项目.技术可以指人类对机器.硬件或人造器皿的运用,但它也可以包含 ...
- 【English】十三、英语中的连词有哪些,都有什么作用
一.什么是连词 参考:https://m.hujiang.com/en_cixing/yylc/ 连词是一种虚词,用于连接单词.短语.从句或句子,在句子中不单独用作句子成分. 连词按其性质可分为并列连 ...
- 关于Java 中跳出多重循环
前言 环境:window10 JDK 1.8 应用场景:在多个for循环或while循环中,直接跳到最外层的循环外面,而不是需要层层退出来. 使用: 使用一个标签label(也可以是其他单词,不能是关 ...