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#列表页面
前台页面: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Index.aspx ...
- 使用C# 操作存储过程,执行sql语句通用类
如何使用C# 操作存储过程,执行sql语句? 闲话不多说,直接上代码: /// <summary> /// Sql通用类 /// </summary> ...
- Spring Boot 2.X 如何优雅的解决跨域问题?
一.什么是源和跨域 源(origin)就是协议.域名和端口号.URL由协议.域名.端口和路径组成,如果两个URL的协议.域名和端口全部相同,则表示他们同源.否则,只要协议.域名.端口有任何一个不同,就 ...
- 多线程之Thread
Thread类可以创建和控制线程,Thread类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数. Thread类默认创建的是前台线程,所以我 ...
- Fundebug支持浏览器报警
摘要: 除了邮件报警和第三方报警,我们新增了浏览器报警功能. 邮件报警与第三方报警 Fundebug是专业的应用BUG监控服务,当您的线上应用,比如网页.小程序.Java等发生BUG时,我们会第一时间 ...
- Mac电脑 怎么导出安卓手机的相册
1.mac上下载一个HandShaker 2.把电脑和手机设置在同一个wifi下 3.安卓手机上下载一个HandShaker 参考:https://zhidao.baidu.com/question/ ...
- 微信分享大图遇到的问题(Android)
起因: 要做一个微信图片分享的功能,但是对于大图会如下问题: 当时没有仔细查看错误日志,单纯的以为是图片太大的问题. 分享图片代码: public void WXsharePic(String tra ...
- <3>Centos系统完整安装python流程
一.环境 系统:Centos7 Python:3.6.5 自带pip.setuptools 二.命令 介绍:因为yum是依赖于python2,所以千万别删除自带的python2,下面的方法就是py2 ...
- 使用GDB调试Android Native 层代码
--------------步骤:0. adb root0. adb shell0. ps | grep browser1. gdbserver :5039 --attach pid2. adb fo ...
- Docker-镜像源加速配置
Docker官网镜像服务在境外,拉取速度很比较慢,所以我们安装完Docker后一般会切换镜像源,将镜像源切换到国内以此达到加速的目的. 国内比较常用的Docker Hub镜像服务:1.阿里云2.Dao ...