【bzoj3813】奇数国 线段树
题目描述
输入
输出
样例输入
6
013
115
013
117
013
023
样例输出
18
24
36
6
题解
线段树
考虑到$\varphi$的求法:$\varphi(n)=n\sum\limits_{prime(p)\& p|n}\frac{p-1}p$。所以需要维护的就是区间乘积和区间所有出现过的质数。
由于所有数都可以由前60个质数表示,因此可以维护乘积中每个质数是否出现。使用二进制位运算即可。
最后对于每个质因子计算并求出答案。
时间复杂度$O(60m+m\log n)$。
#include <cstdio>
#define N 100010
#define mod 19961993
#define lson l , mid , x << 1
#define rson mid + 1 , r , x << 1 | 1
typedef long long ll;
const int n = 100000;
int p[60] , inv[60];
struct data
{
ll w , v;
data() {}
data(int x)
{
int i;
w = x , v = 0;
for(i = 0 ; i < 60 ; i ++ )
if(x % p[i] == 0)
v |= (1ll << i);
}
data operator+(const data &a)const
{
data ans;
ans.w = w * a.w % mod , ans.v = v | a.v;
return ans;
}
}a[N << 2];
inline void pushup(int x)
{
a[x] = a[x << 1] + a[x << 1 | 1];
}
void build(int l , int r , int x)
{
if(l == r)
{
a[x] = data(3);
return;
}
int mid = (l + r) >> 1;
build(lson) , build(rson);
pushup(x);
}
void update(int p , int v , int l , int r , int x)
{
if(l == r)
{
a[x] = data(v);
return;
}
int mid = (l + r) >> 1;
if(p <= mid) update(p , v , lson);
else update(p , v , rson);
pushup(x);
}
data query(int b , int e , int l , int r , int x)
{
if(b <= l && r <= e) return a[x];
int mid = (l + r) >> 1;
if(e <= mid) return query(b , e , lson);
else if(b > mid) return query(b , e , rson);
else return query(b , e , lson) + query(b , e , rson);
}
inline ll pow(ll x , int y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
inline bool judge(ll x)
{
ll i;
for(i = 2 ; i * i <= x ; i ++ )
if(x % i == 0)
return 0;
return 1;
}
inline void init()
{
ll i;
int tot = 0;
for(i = 2 ; tot < 60 ; i ++ )
if(judge(i))
p[tot] = i , inv[tot] = pow(p[tot] , mod - 2) , tot ++ ; }
int main()
{
init();
int m , i , x , y , z;
data t;
scanf("%d" , &m);
build(1 , n , 1);
while(m -- )
{
scanf("%d%d%d" , &x , &y , &z);
if(x) update(y , z , 1 , n , 1);
else
{
t = query(y , z , 1 , n , 1);
for(i = 0 ; i < 60 ; i ++ )
if(t.v & (1ll << i))
t.w = t.w * (p[i] - 1) % mod * inv[i] % mod;
printf("%lld\n" , t.w);
}
}
return 0;
}
【bzoj3813】奇数国 线段树的更多相关文章
- [BZOJ3813] 奇数国 - 线段树
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 912 Solved: 508[Submit][Status][Discuss] ...
- [bzoj3813] 奇数国 [线段树+欧拉函数]
题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...
- 【BZOJ3813】奇数国 线段树+欧拉函数
[BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...
- 【BZOJ3813】【清华集训2014】奇数国 线段树 数学
题目描述 给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\).每个数的质因子都只有前\(60\)个质数.有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i ...
- BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 755 Solved: 432[Submit][Status][Discuss] ...
- BZOJ3813: 奇数国
传送门 欧拉函数+线段树 因为只有60个素数,所以把状态压成long long的形式.用线段树维护区间和和区间和中有多少个质数.然后xjb搞搞就行了,具体参见代码. //BZOJ 3813 //by ...
- [bzoj3813]奇数园
仿佛现在已经完成了做题之前先开个坑的习惯,也许是为了逼迫自己去刷一些神题吧...然并卵,该剩的好多坑还是剩着呢. [bzoj3813]一道线段树好题.已经把数论忘光光了. 欧几里德算法 扩展欧几里德算 ...
- @loj - 3043@「ZJOI2019」线段树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 九条可怜是一个喜欢数据结构的女孩子,在常见的数据结构中,可怜最喜 ...
- 【bzoj3813】: 奇数国 数论-线段树-欧拉函数
[bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...
随机推荐
- Java语言利用Collections.sort对Map,List排序
1.main方法包含TreeMap排序1,TreeMap排序2,HashMap排序,List<Integer>排序,List<Bean>排序,List<Map>排序 ...
- node 写api几个简单的问题
最近出了一直在做无聊的管理后台,还抽空做了我公司的计费终端,前端vue,后端node,代码层面没啥太多的东西.由于自己node版本是8.0.0,node自身是不支持import和export的,要想基 ...
- mysql在cmd里中文乱码解决办法
右边画红线部分中文已经乱码,左边红线里中文则完美显示出来了. 解决办法 用set names utf-8: 效果如图
- Delphi方法
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, For ...
- py3.7.1下pyinstaller 的安装及打包 坑
实在无语了,写了个小程序,用pyinstaller打包,运行就出现这个pip install pywin32-ctypes.明明全部都已经安装了啊. 解决办法: 不要在工程设置里安装pyinstall ...
- dot安装和使用
1.安装 apt-get install graphviz 如果报错说缺少依赖文件,则使用apt自动安装依赖项 apt-get -f install 我在安装中报错: dpkg: unrecovera ...
- C++ vector的reserve和resize详解
vector 的reserve增加了vector的capacity,但是它的size没有改变!而resize改变了vector的capacity同时也增加了它的size!原因如下: rese ...
- 为什么我要放弃javaScript数据结构与算法(第三章)—— 栈
有两种结构类似于数组,但在添加和删除元素时更加可控,它们就是栈和队列. 第三章 栈 栈数据结构 栈是一种遵循后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称为栈顶,另一 ...
- HBase-site.xml 常见重要配置参数
HBase 常见重要配置参数 (1) Hbase.rpc.timeout rpc 的超时时间,默认 60s,不建议修改,避免影响正常的业务,在线上环境刚开始配置的是 3 秒,运行半天后发现了大量的 t ...
- Grok Debugger本地安装(转载)
原文链接:http://fengwan.blog.51cto.com/508652/1758845 最近在使用ELK对日志进行集中管理,因为涉及到日志的规则经常要用到http://grokdebug. ...