题目描述

  给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\)。每个数的质因子都只有前\(60\)个质数。有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i=l}^ra_i)\)

  模数为\(19961993\),是个质数

  \(n=100000,q\leq 100000\)

题解

  水题

\[\phi(x)=x\prod_{p_i|x}(1-\frac1{p_i})
\]

  用线段树维护区间乘积和这个区间的乘积的质因子(每个质数有没有出现)

  然后乱搞

  时间复杂度:\(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】奇数国 线段树 数学的更多相关文章

  1. UOJ46. 【清华集训2014】玄学 [线段树,二进制分组]

    UOJ 思路 模拟赛出了这题,结果我没学过二进制分组--一波主席树然后空间就爆炸了-- 用线段树维护时间序列,每个节点维护\(a_i\to x_i\times a_i+b_i,i\in [1,n]\) ...

  2. UOJ46 清华集训2014玄学(线段树)

    注意到操作有结合律,容易想到用一个矩形表示第i次操作对第j个位置的数的影响.那么修改是单行内的区间修改,而查询是单列内的区间查询.这样二维线段树上以列为外层行为内层直接打标记就可以维护.然后就喜闻乐见 ...

  3. 【数论&线段树】【P4140】[清华集训2015]奇数国

    Description 有一个长为 \(n\) 的序列,保证序列元素不超过 \(10^6\) 且其质因数集是前60个质数集合的子集.初始时全部都是 \(3\),有 \(m\) 次操作,要么要求支持单点 ...

  4. 【BZOJ3813】奇数国 线段树+欧拉函数

    [BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...

  5. [BZOJ3813] 奇数国 - 线段树

    3813: 奇数国 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 912  Solved: 508[Submit][Status][Discuss] ...

  6. 【bzoj3813】奇数国 线段树

    题目描述 给出一个长度为n的序列,每个数都可以由前60个质数的乘积表示,初始每个数都是3.支持两种操作:(1)修改一个数 (2)查询一段区间内所有数的乘积的欧拉函数值模19961993. 输入 第一行 ...

  7. [bzoj3813] 奇数国 [线段树+欧拉函数]

    题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...

  8. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  9. LOJ 164 【清华集训2015】V——线段树维护历史最值

    题目:http://uoj.ac/problem/164 把操作改成形如 ( a,b ) 表示加上 a 之后对 b 取 max 的意思. 每个点维护当前的 a , b ,还有历史最大的 a , b 即 ...

随机推荐

  1. Minesweeper

    你玩过扫雷吗?这个可爱的小游戏带有一个我们记不住名字的操作系统.游戏的目标是找到所有地雷在M x N场中的位置.游戏在一个正方形中显示一个数字,它告诉你在这个正方形附近有 多少个地雷.每个方块最多有八 ...

  2. 2018 Multi-University Training Contest 1

    比赛链接:2018 Multi-University Training Contest 1 6301 Distinct Values 题意:输出一个长度为n的序列,要求满足m个区间的数都不相同,并且字 ...

  3. iOS Keychain,SSKeychain,使用 理解 原理

    https://www.cnblogs.com/m4abcd/p/5242254.html Keychain 使用? ---为了实用最大化我觉得我应该直接先说使用! 当然是使用第三方库啦:sskeyc ...

  4. Django lazy load 懒加载 倒序查询

    Django orm默认懒加载   Django orm默认使用的懒加载,即使用的时候才去访问数据库,且每次默认取最少的数据,当然这样有好处也有坏处... 坏处: 会导致频繁的查询数据库,如涉及到外键 ...

  5. pip 安装 和 卸载 django

    1. 在dos命令行中输入 pip 如下命令进行安装: 安装最新的版本的 Django 命令如下: pip install django 安装 指定版本的 Django 命令如下: pip insta ...

  6. Linux 下面RPM 安装的SQLSERVER 修改字符集的方法

    1. 自己还是太low 2. 遇到问题 先 -h 处理 3. 发现登录报错, 怀疑是字符集的问题: 4. 计划是修改字符集 到 自己的环境可用的状态 使用命令 /opt/mssql/bin/mssql ...

  7. js判断数组是否包含某个字符串变量的实例

    最近碰到一个这样的现象,后台返回的数据中,数组里面有一些有变量值,有一些没有变量值. 举个例子,比如后台返回的例子是这样的: var arr=[ { "status":" ...

  8. JS学习笔记 等于和包装对象

    严格等于 a===b 首先判断两边数据的类型,若类型不同,返回false. 若类型相同(1.2和1.2,字符串相等指内容和长度都是一样的),返回true null===null undefined== ...

  9. Linux 的相关操作

    切换权限   在linux环境下,用户之前的切换使用 “su - name,若要切换到root下面,则使用sudo su 命令即可. 在linux下安装软件,经常就是装完后不知道装到哪里去了 (201 ...

  10. Python对elasticsearch的CRUD

    一.官网提供的Elasticsearch的Python接口包 1.github地址:https://github.com/elastic/elasticsearch-dsl-py 2.安装:pip i ...