【BZOJ3813】【清华集训2014】奇数国 线段树 数学
题目描述
给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\)。每个数的质因子都只有前\(60\)个质数。有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i=l}^ra_i)\)
模数为\(19961993\),是个质数
\(n=100000,q\leq 100000\)
题解
水题
\]
用线段树维护区间乘积和这个区间的乘积的质因子(每个质数有没有出现)
然后乱搞
时间复杂度:\(O(q\log n)\)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#include<utility>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
ll p=19961993;
ll pp=p;
ll fp(ll a,ll b)
{
ll s=1;
while(b)
{
if(b&1)
s=s*a%p;
a=a*a%p;
b>>=1;
}
return s;
}
int pri[110];
ll a[110];
ll s[500010];
ll o[500010];
int ls(int x){return x*2;}
int rs(int x){return x*2+1;}
void build(int p=1,int l=1,int r=100000)
{
if(l==r)
{
s[p]=3;
o[p]=2;
return;
}
int mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
s[p]=s[ls(p)]*s[rs(p)]%pp;
o[p]=o[ls(p)]|o[rs(p)];
}
void change(int p,int x,ll v1,ll v2,int L=1,int R=100000)
{
if(L==R)
{
s[p]=v1;
o[p]=v2;
return;
}
int mid=(L+R)>>1;
if(x<=mid)
change(ls(p),x,v1,v2,L,mid);
else
change(rs(p),x,v1,v2,mid+1,R);
s[p]=s[ls(p)]*s[rs(p)]%pp;
o[p]=o[ls(p)]|o[rs(p)];
}
pll query(int p,int l,int r,int L=1,int R=100000)
{
if(l<=L&&r>=R)
return pll(s[p],o[p]);
int mid=(L+R)>>1;
pll s(1,0);
if(l<=mid)
{
pll s1=query(ls(p),l,r,L,mid);
s.first=s.first*s1.first%pp;
s.second|=s1.second;
}
if(r>mid)
{
pll s2=query(rs(p),l,r,mid+1,R);
s.first=s.first*s2.first%pp;
s.second|=s2.second;
}
return s;
}
int main()
{
freopen("d1t3.in","r",stdin);
freopen("d1t3.out","w",stdout);
build();
int n;
scanf("%d",&n);
int i,j;
int cnt=0;
for(i=2;i<=281;i++)
{
for(j=2;j<i;j++)
if(i%j==0)
break;
if(j>=i)
{
pri[++cnt]=i;
a[cnt]=(i-1)*fp(i,p-2)%p;
}
}
int x,y,z;
for(i=1;i<=n;i++)
{
scanf("%d%d%d",&x,&y,&z);
if(x)
{
ll v=0;
for(j=1;j<=cnt;j++)
if(z%pri[j]==0)
v|=1ll<<(j-1);
change(1,y,z,v);
}
else
{
pll s=query(1,y,z);
ll ans=s.first;
for(j=1;j<=60;j++)
if(s.second&(1ll<<(j-1)))
ans=ans*a[j]%p;
printf("%lld\n",ans);
}
}
return 0;
}
【BZOJ3813】【清华集训2014】奇数国 线段树 数学的更多相关文章
- UOJ46. 【清华集训2014】玄学 [线段树,二进制分组]
UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\) ...
- UOJ46 清华集训2014玄学(线段树)
注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见 ...
- 【数论&线段树】【P4140】[清华集训2015]奇数国
Description 有一个长为 \(n\) 的序列,保证序列元素不超过 \(10^6\) 且其质因数集是前60个质数集合的子集.初始时全部都是 \(3\),有 \(m\) 次操作,要么要求支持单点 ...
- 【BZOJ3813】奇数国 线段树+欧拉函数
[BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...
- [BZOJ3813] 奇数国 - 线段树
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 912 Solved: 508[Submit][Status][Discuss] ...
- 【bzoj3813】奇数国 线段树
题目描述 给出一个长度为n的序列,每个数都可以由前60个质数的乘积表示,初始每个数都是3.支持两种操作:(1)修改一个数 (2)查询一段区间内所有数的乘积的欧拉函数值模19961993. 输入 第一行 ...
- [bzoj3813] 奇数国 [线段树+欧拉函数]
题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...
- UOJ #164. 【清华集训2015】V | 线段树
题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...
- LOJ 164 【清华集训2015】V——线段树维护历史最值
题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...
随机推荐
- MySQL的常用命令:添加外键,修改字段名称,增加字段 设置主键自增长等
Mysql命令添加外键 前提是有这么几个表 以mall_product 和 mall_category为例 ALTER TABLE mall_product ADD CONSTRAINT fore_ ...
- sczd
- MySQL和Oracle的区别
由于SQL Server不常用,所以这里只针对MySQL数据库和Oracle数据库的区别 (1) 对事务的提交 MySQL默认是自动提交,而Oracle默认不自动提交,需要用户手动提交,需要在写 ...
- Python_生产者消费者模型、管道、数据共享、进程池
1.生产者消费者模型 生产者 —— 生产数据的人 消费者 —— 消费数据的人 生产者消费者模型:供销数据不平衡的现象. import time import random from multiproc ...
- 【问题解决方案】Git bash进入多层子目录问题(通配符问题留坑)
cd进入指定路径下:cd 斜杠 斜杠 方法一: 1- 撇丿,不是"那",盘符前面要加上 / (d盘前面也加,不加也行) 2- 路径名不区分大小写 3- 不用空格 4- 如果目录名中 ...
- rem 适配
postcss-pxtorem 是一款 postcss 插件,用于将单位转化为 rem lib-flexible 用于设置 rem 基准值 一.webpact postcss 插件将px转化为rem单 ...
- springboot注解@SpringBootApplication分析
@SpringBootApplication注解用在Spring Boot的入口类上面,是Spring Boot提供的应用启动相关的注解. 直接上注解的源码: @Target(ElementType. ...
- Redis 安装学习
Linux下下载安装redis https://redis.io/download tar -zvxf redisxxx cd redisxxxx make ---进行安装 vim ~.bash_p ...
- mybatis插入数据并返回自增Id
上图mybatis的写法,在xxxMapper.xml中: 加入:useGeneratedKeys="true" keyProperty="applyId" k ...
- 源码追踪,解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
在windows系统本地运行spark的wordcount程序,会出现一个异常,但不影响现有程序运行. >>提君博客原创 http://www.cnblogs.com/tijun/ & ...