【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 即 ...
随机推荐
- Leetcode 101. Symmetric Tree(easy)
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For e ...
- Minimal string CodeForces – 797C
题目链接 题目难度: 1700rating 题目类型:string+贪心+STL 题目思路: 由于题目要求的最终结果是字典序最小的那个字符串,那么我们从贪心的从’a’开始查找字符串里是否存在,如果存在 ...
- html总结:表格中的文字居中
<style> table { text-align:center; } </style>
- no-sql数据库之redis
一.FAQ 1.如果用连接器连接redis不成功,报如下错误: crash-report-server replied:Request Entity Too Large 则可以先通过cmd命令查看端口 ...
- 初次使用beego框架
安装beego框架以及bee工具 go get -u github.com/astaxie/beego go get github.com/beego/bee 创建一个新项目 bee new weba ...
- Linux 典型应用之缓存服务
memcached 安装和简单使用 yum install memcached 启动 -d 表示以守护进程的方式启动 memcached -d 安装telnet 它可以检测某个端口是否是通的,可以发送 ...
- IdentityServer4【QuickStart】之使用ClientCredentials流程保护API
使用ClientCredentials流程保护API 这个示例展示了使用IdentityServer中保护APIs的最基本的场景. 在这个场景中我们会定义一个API和一个想要访问它的客户端.客户端会在 ...
- Mac上通过iterm 上传文件到服务器
.安装 brew install lrzsz #这里以homebrew方式安装12.脚本 拉取 https://github.com/mmastrac/iterm2-zmodem 两个sh文件,将他们 ...
- MySQL经典编程问题
星期数的问题 1 计算日期是周几 这个问题看似很简单,可以用MySQL内置函数来计算 (1) weekday(date)其返回值是0-6,0代表Monday, 6代表Sunday: (2) dayof ...
- input type=date时,时间数据回填,报错The specified value "2019-0404-18" does not conform to the required format, "yyyy-MM-dd".
<input autocomplete id="start-time" name="start_time" type="date" c ...