zoj 3886 Nico Number
中文题面:
问题描述】
我们定义一个非负整数是“好数”,当且仅当它符合以下条件之一:
1. 这个数是0或1
2. 所有小于这个数且与它互质的正整数可以排成一个等差数列
例如,8就是一个好数,因为1,3,5,7排成了等差数列。
给出N个非负整数,然后进行如下三个操作:
1. 询问区间[L,R]有多少个好数
2. 将区间[L,R]内所有数对S取余(S≤1000000)
3. 将第C个数更改为X
提示:如果你不知道如何判断一个数是否为好数,你可以打个表找找规律。
【输入格式】
输入文件名为good.in。
第一行包含两个正整数N和M,M表示操作数目
第二行包含N个非负整数。
接下来的M行每行表示1个操作:“1 L R”表示第1个操作,“2 L R S”表
示第2个操作,“3 C X”表示第3个操作。
【输出格式】
输出文件名为color.out。
对每个操作1,输出一个非负整数,表示区间内好数的个数。
【输入输出样例1】
3 6
4 6 9
1 1 3
1 3 3
2 1 1 10
1 1 3
3 2 4
1 1 3
输出
2
0
2
2
数据规模与约定】
样例点编号 N M N个数大小(≤) 具有的操作
1,2 100 100 100 1,2,3
3,4 1000 1000 1000000 1,2,3
5,6,7 100000 100000 1000000 1,3
8,9,10 100000 100000 1000000 1,2,3
题解:
这个题目首先要打表找到好数的规律,不难发现只有2幂,质数以及6是好数,那么这个题目就可以预处理出1~100000中的所有的好数,用线性筛就可以了,知道这个东西之后题目就变成了统计区间好数的个数,用线段树维护就可以了,但这个题目要区间取模,因为对于一个数最多只要取模logn次就可以取模完成,所以只要在线段树中每次递归到叶子节点,暴力取就可以了,(当然模数>区间最大值时就不要模了)。
代码:(没写多组数据的,改一下就好了)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 1000015
#define MAXN2 100015
using namespace std;
struct tree{
int l,r,x,shu,maxx;
}a[MAXN2*];
bool can[MAXN];
int zhi[MAXN2];
int n,m; void yvchuli(){
memset(can,,sizeof(can));
can[]=can[]=;
for(int i=;i<=;i++){
if(can[i]){
for(int j=i*;j<=;j+=i) can[j]=;
}
}
can[]=can[]=can[]=;
int now=;
while(now<=) {can[now]=;now*=;}
} void build(int xv,int l,int r){
if(l==r){
a[xv].l=l,a[xv].r=r;
a[xv].shu=zhi[l],a[xv].maxx=zhi[l];
if(can[zhi[l]]) a[xv].x=;
else a[xv].x=;
return;
}
a[xv].l=l,a[xv].r=r;
int mid=(l+r)/;
build(xv*,l,mid);build(xv*+,mid+,r);
a[xv].maxx=max(a[xv*].maxx,a[xv*+].maxx);
a[xv].x=a[xv*].x+a[xv*+].x;
} int query(int xv,int l,int r){
int L=a[xv].l,R=a[xv].r,mid=(L+R)/;
if(l==L&&r==R){
return a[xv].x;
}
if(r<=mid) return query(xv*,l,r);
if(l>mid) return query(xv*+,l,r);
return query(xv*,l,mid)+query(xv*+,mid+,r);
} void change(int xv,int pos,int hh){
int l=a[xv].l,r=a[xv].r,mid=(l+r)/;
if(l==r&&l==pos){
a[xv].shu=hh;
a[xv].maxx=hh;
if(can[hh]) a[xv].x=;
else a[xv].x=;
return;
}
if(pos<=mid) change(xv*,pos,hh);
else change(xv*+,pos,hh);
a[xv].x=a[xv*].x+a[xv*+].x;
a[xv].maxx=max(a[xv*].maxx,a[xv*+].maxx);
} void Ray(int xv,int l,int r,int S){
int L=a[xv].l,R=a[xv].r,mid=(L+R)/;
if(a[xv].maxx<S) return;
if(L==R){
a[xv].shu%=S;
a[xv].maxx=a[xv].shu;
if(can[a[xv].shu]) a[xv].x=;
else a[xv].x=;
return;
}
if(r<=mid) Ray(xv*,l,r,S);
else if(l>mid) Ray(xv*+,l,r,S);
else Ray(xv*,l,mid,S),Ray(xv*+,mid+,r,S);
a[xv].x=a[xv*].x+a[xv*+].x;
a[xv].maxx=max(a[xv*].maxx,a[xv*+].maxx);
} int main()
{
yvchuli();
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&zhi[i]);
build(,,n);
while(m--){
int id,x,y,z;scanf("%d%d%d",&id,&x,&y);
if(id==){
int numm=query(,x,y);
printf("%d\n",numm);
}
else if(id==){
scanf("%d",&z);
Ray(,x,y,z);
}
else change(,x,y);
}
return ;
}
zoj 3886 Nico Number的更多相关文章
- ZOJ 3886 Nico Number(筛素数+Love(线)Live(段)树)
problemCode=3886">ZOJ 3886 题意: 定义一种NicoNico数x,x有下面特征: 全部不大于x且与x互质的数成等差数列,如x = 5 ,与5互素且不大于5的数 ...
- ZOJ 3622 Magic Number 打表找规律
A - Magic Number Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Subm ...
- ZOJ 3436 July Number(DFS)
题意 把一个数替换为这个数相邻数字差组成的数 知道这个数仅仅剩一位数 若最后的一位数是7 则称原来的数为 July Number 给你一个区间 求这个区间中July Number的个数 ...
- ZOJ 3233 Lucky Number
Lucky Number Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Original I ...
- [ZOJ 3622] Magic Number
Magic Number Time Limit: 2 Seconds Memory Limit: 32768 KB A positive number y is called magic n ...
- ZOJ 3622 Magic Number(数)
题意 假设一个正整数y满足 将随意正整数x放到y的左边得到的数z满足 z%y==0 那么这个数就是个Magic Number 给你一个范围 求这个范围内Magic Number的个数 令 ...
- zoj 1526 Big Number 数学
Big Number Time Limit: 10 Seconds Memory Limit: 32768 KB In many applications very large intege ...
- ZOJ 3690 Choosing number(矩阵)
Choosing number [题目链接]Choosing number [题目类型]矩阵 &题解: 这题就和已经dp极像了,所以找方程就很困难了.可以这样找: 设f(n)是前n-1个人已经 ...
- ZOJ 3702 Gibonacci number 2017-04-06 23:28 28人阅读 评论(0) 收藏
Gibonacci number Time Limit: 2 Seconds Memory Limit: 65536 KB In mathematical terms, the normal ...
随机推荐
- ASP.NET MVC实现依赖注入
在java的spring中有自动注入功能,使得代码变得更加简洁灵活,所以想把这个功能移植到c#中,接下来逐步分析实现过程 1.使用自动注入场景分析 在asp.net mvc中,无论是什么代码逻辑分层, ...
- 通过Service访问应用 (1)
目录 通过Service访问应用 通过Pod IP访问应用 通过ClusterIP Service在集群内部访问 通过Service访问应用 通过之前的操作,应用部署完成了,我们的Demo网站已 ...
- IP地址和int互转
/** * @author: yqq * @date: 2019/5/8 * @description: ip地址与int之间互换 * https://mp.weixin.qq.com/s?__biz ...
- 使用dubbo引用和发布服务时出现的异常:HTTP状态500 - 请求处理失败; 嵌套异常是com.alibaba.dubbo.rpc.RpcException:无法在服务cn.e3mall.service.ItemService中调用方法getTbItemById。使用dubbo版本2.5.3在消费者...
异常情况如下: 从异常看,主要是因为TbItem没有序列化: 分析问题: 表现层调用服务端时返回了一个TbItem对象即Java对象,此时这个对象远程调用拿过来必须进行序列化,要进行网络传输必须先要把 ...
- android 中Application的作用
转自:lieren666 博客地址:http://blog.csdn.net/lieren666/article/details/7598288 What is Application Applica ...
- 面试贴:java异常小结
java的异常处理在面试中通常是个敏感的话题,这里我从整体框架方面稍微作一下我的小结. java的异常都继承Throwable这个类,也就是都可以抛出来的异常,在这个祖先类下,又分为如下子类: 1.E ...
- Flink入门宝典(详细截图版)
本文基于java构建Flink1.9版本入门程序,需要Maven 3.0.4 和 Java 8 以上版本.需要安装Netcat进行简单调试. 这里简述安装过程,并使用IDEA进行开发一个简单流处理程序 ...
- NOIP2006 1.明明的随机数
题目:明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不 ...
- 第二场周赛(递归递推个人Rank赛)——题解
很高兴给大家出题,本次难度低于上一场,新生的六个题都可以直接裸递归式或者裸递推式解决,对于老生的汉诺塔3,需要找出一般式,后两题分别为裸ST算法(或线段树)/线性DP. 正确的难度顺序为 种花 角谷定 ...
- 前端利器躬行记(6)——Fiddler
Fiddler是一款免费的.基于Windows系统的代理服务器软件(即Web调试抓包工具),由Eric Lawrence用C#语言在2003年10月发布了第一个版本.注意,由于Fiddler依赖Mic ...