题目大意:

  求l~r中有多少数与x互质,带单点修改

分析:

  两个30的部分分很好打:

    ·n<=1000暴力O(nq)就好了

    ·$a_i<=100$用树状数组维护每个x的前缀和就好了

  100分做法有两种,一种是莫比乌斯反演(我不会),还有一种就是bitset乱搞

  我们先筛法筛出所有质数(大概不到10000个)然后对于每个质数建立一个bitset,表示对于第i个数在有第j个质数这个质因子

  求有多少数与x互质转换为有多少数与x不互质就好了

  对于每次询问把所有x的质因子找出来然后把这些数的bitset或起来再用类似前缀和的方法维护即可

  时间复杂度$O(\frac{n*Q*logn}{32})$显然跑不满,所以卡一卡就过了(跑的比莫比乌斯反演快)

代码:(这里把两种部分分的打法也都写上了)

 #pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
#define lowbit(x) (x&(-x))
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-')f=-;chr=getchar();}
while(isdigit(chr)) {ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}const int M = 5e4+;
int n,m,a[M],Q,ans,gcd[][];
struct P{
int s[M];
void Update(int x,int a){for(;x<=n;x+=lowbit(x)) s[x]+=a;}
int Query(int x){int res=;for(;x;x-=lowbit(x)) res+=s[x];return res;}
}t[];
//-------------------------------------------------第一个30pts --------------------------------------------------
inline void Solve_1(){//n*Q<=1000000
while(Q--){
int opt=read(),x;
if(opt==) x=read(),a[x]=read();
else{
int l=read(),r=read();
x=read();ans=;
for(int i=l;i<=r;i++)
if(__gcd(x,a[i])==)
++ans;
printf("%d\n",ans);
}
}
}
//---------------------------------------第二个30pts -----------------------------------------------------
inline void Solve_2(){//Ai<=100
for(int i=;i<=;++i)
for(int j=;j<=;++j)
gcd[i][j]=__gcd(i,j);
for(int i=;i<=;i++)
for(int j=;j<=n;j++)
if(gcd[i][a[j]]==)
t[i].Update(j,);
while(Q--){
int opt=read();
if(opt==){
int x=read(),y=read(),tt=a[x];
a[x]=y;
for(int i();i<=;++i){
if(gcd[a[x]][i]!=&&gcd[tt][i]==)
t[i].Update(x,-);
if(gcd[a[x]][i]==&&gcd[tt][i]!=)
t[i].Update(x,);
}
}else{int l=read(),r=read(),x=read();
printf("%d\n",t[x].Query(r)-t[x].Query(l-));
}
}
}bitset<M>s[],now;
int v[M*],pri[M*],tot;
//----------------------------------------通解--------------------------------------------
inline void Get_Pri(){
for(int i=;i<=;i++){
if(!v[i]) v[i]=i,pri[++tot]=i;
for(int j=;j<=tot;j++){
if(pri[j]>/i||pri[j]>v[i]) break;
v[i*pri[j]]=pri[j];
}
}
}
inline void Update(int pos,int x,int y){
int i=;
while(){
if(pri[i]*pri[i]>x) break;
if(x%pri[i]==){
s[i][pos]=y;
while(x%pri[i]==) x/=pri[i];
}i++;
}if(x>)s[lower_bound(pri+,pri+tot+,x)-pri][pos]=y;
}
inline void Solve(){
Get_Pri();
for(int i=;i<=n;i++) Update(i,a[i],);
while(Q--){
int opt=read();
if(opt==){
int x=read(),y=read();
Update(x,a[x],),Update(x,y,);
a[x]=y;
}else{
int l=read(),r=read(),x=read();
int i=;now=;
while(){
if(pri[i]*pri[i]>x) break;
if(x%pri[i]==){
now|=s[i];
while(x%pri[i]==) x/=pri[i];
}i++;
}if(x>) now|=s[lower_bound(pri+,pri+tot+,x)-pri];
int Ans=r-l+-(now>>l).count()+(now>>(r+)).count();
printf("%d\n",Ans);
}
}
}
int main(){
freopen("gcd.in","r",stdin);
freopen("gcd.out","w",stdout);
n=read();
for(int i=;i<=n;++i) a[i]=read();
Q=read();
// if(n*Q<=1000000) Solve_1();
// else Solve_2();
Solve();
return ;
}

[NOIP2019模拟赛]数数(gcd)的更多相关文章

  1. Java 第十一届 蓝桥杯 省模拟赛 洁净数

    洁净数 小明非常不喜欢数字 2,包括那些数位上包含数字 2 的数.如果一个数的数位不包含数字 2,小明将它称为洁净数. 请问在整数 1 至 n 中,洁净数有多少个? 输入格式 输入的第一行包含一个整数 ...

  2. 计蒜客NOIP模拟赛D2T3 数三角形

    刚刚上高中的洁洁在学习组合数学的过程中遇到一道麻烦的题目,她希望你能帮助她解决.给定一张无向完全图 G,其中大部分边被染成蓝色,但也有一些边被染成红色或者绿色.现在,洁洁需要给这张图的多样性进行打分. ...

  3. test20190818 NOIP2019 模拟赛

    0+0+20=20,不给大样例,小数据又水,还没有题解的垃圾题. A 题 问题描述: long long ago, Lxhgww 统治的国家里有 n 个城市,其中某一个城市是 capital (首都) ...

  4. test20190827 NOIP2019 模拟赛

    100+100+50=250.最后那道期望题需要用另外的方式统计. 精灵加护 ljss 被 M 个敌人打倒在地上啦!每个敌人有一个威力值 bi.但是他手中还拥有 N 把武器!每把武器有一个威力值 ai ...

  5. test20190816 NOIP2019 模拟赛

    100+100+20=220,T3吐槽:整个考室没有一个人正确地理解了题意. 树上路径(phantasm) Akari 的学校的校门前生长着一排 n 棵树,从西向东依次编号为 1 ∼ n.相邻两棵树间 ...

  6. 题解 noip2019模拟赛Day1T3

    题面 运河计划 问题描述 水运在人类的交通运输史中一直扮演着重要的角色.借助河流.的便利,人们得以把大量的货物输送到天南海北不仅仅是自然界现成的河流,人工开凿的运河(如苏伊士运河.巴拿马运河.我国的京 ...

  7. [NOIP2019模拟赛][AT2381] Nuske vs Phantom Thnook

    题目链接 评测姬好快啊(港记号?)暴力40pts变成60pts 因为题目说了保证蓝色点两两之间只有一条路径,所以肯定组成了一棵树,而对于每次询问的x1,y1,x2,y2的子矩阵中就存在着一个森林 不难 ...

  8. [NOIP2019模拟赛]HC1147 时空阵

    题目描述: 幽香这几天学习了魔法,准备建造一个大型的时空传送阵. 幽香现在可以在幻想乡的n个地点建造一些传送门,如果她建造了从地点a与地点b之间的传送门,那么从a到b和从b到a都只需要单位1的时间. ...

  9. Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)

    /* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...

随机推荐

  1. NX二次开发-如何在类外面定义一个结构体

    #include <uf.h> #include <uf_obj.h> #include <uf_part.h> using namespace NXOpen; u ...

  2. NX二次开发-对话框加锁UF_UI_lock_ug_access

    VC/MFC调用UG Dialog要进入加锁状态 加锁 UF_UI_lock_ug_access ( UF_UI_FROM_CUSTOM ); 此处为UF_UI_select的函数 解锁 UF_UI_ ...

  3. Mybatis笔记 – Po映射类型

    一.输入映射类型 parameterType定义输入到sql中的映射类型,可以是  简单类型  .po类对象(可自动生成 或 手动定义). pojo包装对象(用于综合查询,UserCustom用户自定 ...

  4. 创建 Angular 8.0 项目

    创建 Angular 8.0 项目,首先确保已经安装了 nodejs,如果没有安装,请看这篇文章安装:node.js 安装 1.新建一个空文件夹 angularproject,作为工作区 2.安装 A ...

  5. SPSS如何调用已建立的数据文件

    SPSS如何调用已建立的数据文件 调用已建立的数据文件 SPSS可以调用SPSS(*.sav),Excel(*.xls),dBASE(*.dbf),ASCII(*.dat,*.txt)等数据文件. 2 ...

  6. Codeforces 166B - Polygon (判断凸包位置关系)

    Codeforces Round #113 (Div. 2) 题目链接:Polygons You've got another geometrical task. You are given two ...

  7. python语法基础(类)

    一.什么是类? 类是具有相同属性的一类事物 类还有功能和属性,属性就是这类事物的特征,而功能就是它能做什么,也是就是方法或者函数. 在python中类用关键词class来声明 二.类的声明 类的声明方 ...

  8. css之页面三列布局之左右上下高度固定,中间自适应

    第一种,绝对定位 !DOCTYPE HTML> <html> <head> <meta charset="gb2312"> <tit ...

  9. 【笔记篇】斜率优化dp(四) ZJOI2007仓库建设

    传送门戳这里>>> \(n\leq1e6\), 显然还是\(O(n)\)的做法. 这个题有个条件是只能运往编号更大的工厂的仓库, 这也是写出朴素dp的方程的条件. 我们令\(f[i] ...

  10. 【笔记篇】单调队列优化dp学习笔记&&luogu2569_bzoj1855股票交♂易

    DP颂 DP之神 圣洁美丽 算法光芒照大地 我们怀着 崇高敬意 跪倒在DP神殿里 你的复杂 能让蒟蒻 试图入门却放弃 在你光辉 照耀下面 AC真心不容易 dp大概是最经久不衰 亘古不化的算法了吧. 而 ...