题目描述

由于你不会设计哥德尔机,所以你决定先做一道数据结构题:

给定一个长度为 \(n\) 的序列 \(a_1\cdots a_n\)。你需要回答 \(m\) 个询问,第 \(i\) 个询问给定一个区间 \([l_i,r_i]\),请你求出这个区间中所有非空子集的最大公约数的乘积。由于答案可能很大,每次询问请你求出其对 \(998244353\) 取模的结果。

提示

对于 \(100\%\) 的数据,满足 \(1\le n,m,a_i\le 10^5\),\(1\le l_i\le r_i\le n\)。

既然是乘法,对每个质数的次幂单独考虑。

尝试用莫队去维护质数的次幂。我们现在要知道 \(p^{2^i-1}\) 的值,这个可以用倍增弄出来。

但是转移的时候需要枚举所有质因数的次幂,这个复杂度是 \(O(logn)\),复杂度 \(O(n\sqrt nlogn)\),过不了。

有关因数的问题,考虑根号分治。把所有质数次幂 按照质数大小分 成 \(\le 320\) 和 \(>320\) 来考虑。对于 \(\le 320\) 的质数的次幂之和不超过 \(120\),所以拿出去用前缀和处理就行了。 每个数只有一个 \(\ge320\) 的质数,在莫队的时候 \(O(1)\) 维护就可以了。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,P=998244353,iv=P+1>>1;
int n,id[N],sq,l[N],r[N],p=1,q,pr[N],ps[N],ret=1,k,pp[N],cn[N],a[N],to[N],m,ans[N],c[N],fr[N],s[N];
vector<int>g[N],h[N];
int read()
{
int s=0;
char ch=getchar();
while(ch<'0'||ch>'9')
ch=getchar();
while(ch>='0'&&ch<='9')
s=s*10+ch-48,ch=getchar();
return s;
}
int cmp(int x,int y)
{
if(l[x]/sq^l[y]/sq)
return l[x]<l[y];
return r[x]<r[y];
}
int pown(int x,int y)
{
if(!y)
return 1;
int t=pown(x,y>>1);
if(y&1)
return 1LL*t*t%P*x%P;
return 1LL*t*t%P;
}
void add(int x,int y)
{
ret=1LL*ret*h[x][c[x]]%P;
c[x]+=y;
ret=1LL*ret*g[x][c[x]]%P;
}
int main()
{
n=read(),m=read();
sq=sqrt(n);
for(int i=2;i<=320;i++)
{
if(pr[i])
continue;
for(int j=i;j<=100000;j*=i)
ps[++k]=j,fr[k]=i;
for(int j=2;j*i<=100000;j++)
pr[i*j]=1;
}
for(int i=1;i<=100000;i++)
to[i]=1;
for(int i=321;i<=100000;i++)
{
if(!pr[i])
{
g[i].push_back(i);
h[i].push_back(pown(i,P-2));
for(int j=1;j*i<=100000;j++)
to[i*j]=i,pr[i*j]=1;
}
}
g[1].push_back(1);
h[1].push_back(1);
for(int i=1;i<=n;i++)
{
a[i]=read();
g[to[a[i]]].push_back(1LL*g[to[a[i]]].back()*g[to[a[i]]].back()%P);
h[to[a[i]]].push_back(1LL*h[to[a[i]]].back()*h[to[a[i]]].back()%P);
}
for(int i=1;i<=m;i++)
l[i]=read(),r[i]=read(),id[i]=i,ans[i]=1;
for(int i=1;i<=k;i++)
{
for(int j=pp[0]=1;j<=n;j++)
s[j]=a[j]%ps[i]==0;
int iv=pown(pp[0]=fr[i],P-2);
for(int j=1;j<=n;j++)
s[j]+=s[j-1],pp[j]=1LL*pp[j-1]*pp[j-1]%P;
for(int j=1;j<=m;j++)
ans[j]=1LL*ans[j]*pp[s[r[j]]-s[l[j]-1]]%P*iv%P;
}
sort(id+1,id+m+1,cmp);
for(int i=1;i<=m;i++)
{
while(p>l[id[i]])
add(to[a[--p]],1);
while(q<r[id[i]])
add(to[a[++q]],1);
while(p<l[id[i]])
add(to[a[p++]],-1);
while(q>r[id[i]])
add(to[a[q--]],-1);
ans[id[i]]=1LL*ans[id[i]]*ret%P;
}
for(int i=1;i<=m;i++)
printf("%d\n",ans[i]);
}

[Ynoi2002] Goedel Machine的更多相关文章

  1. 【Machine Learning】KNN算法虹膜图片识别

    K-近邻算法虹膜图片识别实战 作者:白宁超 2017年1月3日18:26:33 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  2. 【Machine Learning】Python开发工具:Anaconda+Sublime

    Python开发工具:Anaconda+Sublime 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现 ...

  3. 【Machine Learning】机器学习及其基础概念简介

    机器学习及其基础概念简介 作者:白宁超 2016年12月23日21:24:51 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本系列文章是作者结 ...

  4. 【Machine Learning】决策树案例:基于python的商品购买能力预测系统

    决策树在商品购买能力预测案例中的算法实现 作者:白宁超 2016年12月24日22:05:42 摘要:随着机器学习和深度学习的热潮,各种图书层出不穷.然而多数是基础理论知识介绍,缺乏实现的深入理解.本 ...

  5. 【机器学习Machine Learning】资料大全

    昨天总结了深度学习的资料,今天把机器学习的资料也总结一下(友情提示:有些网站需要"科学上网"^_^) 推荐几本好书: 1.Pattern Recognition and Machi ...

  6. [Machine Learning] Active Learning

    1. 写在前面 在机器学习(Machine learning)领域,监督学习(Supervised learning).非监督学习(Unsupervised learning)以及半监督学习(Semi ...

  7. [Machine Learning & Algorithm]CAML机器学习系列2:深入浅出ML之Entropy-Based家族

    声明:本博客整理自博友@zhouyong计算广告与机器学习-技术共享平台,尊重原创,欢迎感兴趣的博友查看原文. 写在前面 记得在<Pattern Recognition And Machine ...

  8. CPU acceleration status: HAXM is not installed on this machine解决方法

    报错信息: Starting emulator for AVD 'old_android' emulator: WARNING: Classic qemu does not support SMP. ...

  9. Azure PowerShell (6) 设置单个Virtual Machine Endpoint

    <Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...

  10. Azure PowerShell (7) 使用CSV文件批量设置Virtual Machine Endpoint

    <Windows Azure Platform 系列文章目录> 请注意: - Azure不支持增加Endpoint Range - 最多可以增加Endpoint数量为150 http:// ...

随机推荐

  1. ETL之apache hop系列1-ETL概念与hop简介

    ETL 简单介绍 ETL概念 ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的 ...

  2. 三维模型OSGB格式轻量化的纹理压缩和质量保持分析

    三维模型OSGB格式轻量化的纹理压缩和质量保持分析 在三维模型应用中,纹理数据是一个重要的部分,可以为模型增加更多的真实感和细节.但是,由于纹理数据通常会占用大量的存储空间和传输带宽,因此,在OSGB ...

  3. 四层负载均衡的NAT模型与DR模型推导

    导读 本文首先讲述四层负载均衡技术的特点,然后通过提问的方式推导出四层负载均衡器的NAT模型和DR模型的工作原理.通过本文可以了解到四层负载均衡的技术特点.NAT模型和DR模型的工作原理.以及NAT模 ...

  4. 从零开发Java入门项目--十天掌握

    ​ 原文网址:从零开发Java入门项目--十天掌握_IT利刃出鞘的博客-CSDN博客 简介 这是一个靠谱的Java入门项目实战,名字叫蚂蚁爱购.从零开发项目,视频加文档,十天就能学会开发Java项目, ...

  5. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛 矩阵快速幂)

    题目描述 God Water likes to eat meat, fish and chocolate very much, but unfortunately, the doctor tells ...

  6. 每日一题:vue3自定义指令大全(呕心沥血所作,附可运行项目源码)

    1.VUE常用指令大全 本项目所有指令均为全局注册,使用时直接在组件中使用即可. 指令目录:src/directives 页面目录:src/views 具体可查看源码 1.1 权限指令 封装一个权限指 ...

  7. 聊一聊 TLS/SSL

    哈喽大家好,我是咸鱼 当我们在上网冲浪的时候,会在浏览器界面顶部看到一个小锁标志,或者网址以 "https://" 开头 这意味着我们正在使用 TLS/SSL 协议进行安全通信.虽 ...

  8. DESTOON做中英双语言(多语言)切换版本具体详解

    第一次发原创好激动,该注意点什么? 在开发过程中用户有许多要求,比如这个多语言切换就是一个需求. 首先讲解一下DESTOON(DT)后台系统如何做这个中英.甚至多语言切换的这个功能. DT本身不自带多 ...

  9. Swagger系列:SpringBoot3.x中使用Knife4j

    目录 一.简介 二.版本说明 三.使用 四.效果图 一.简介 官网:https://doc.xiaominfo.com/ Knife4j是一个集Swagger2 和 OpenAPI3 为一体的增强解决 ...

  10. 深入理解 Netty FastThreadLocal

    作者:vivo 互联网服务器团队- Jiang Zhu 本文以线上诡异问题为切入点,通过对比JDK ThreadLocal和Netty FastThreadLocal实现逻辑以及优缺点,并深入解读源码 ...