【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) 支持 ...
随机推荐
- go 下面定义嵌套结构
package main import ( "fmt" ) const ( URL = "http://www.163.com" UID = "adm ...
- 前端学习之HTML基础
要点: 理解HTTP请求响应模式及通信规范 HTML的各种标签和常用标签 CSS是用于样式渲染和定位布局 JS将HTML动态化 jquery是JS的高级封装 理解HTTP请求响应模式及通信规范 HTT ...
- latex02-LaTeX源文件的基本结构
1.一个latex文件有且仅有一个document环境 %后表示注释 2.latex的导言区用于全局设置. 例如:title\author\date 加入空行是结构更加清晰 为了能正确的使用标题信息, ...
- GIT LFS 使用笔记
一.背景 由于git上传文件大小受限,所以我们需要使用GIT LFS对大小超过一定上限的大文件进行处理. 二.安装 linux上安装参见 https://askubuntu.com/questions ...
- Kubernetes-tutorials(五)
The tutorials use Katacoda to run a virtual terminal in your web browser that runs Minikube, a small ...
- poj_2339
参考:https://blog.csdn.net/yzl_rex/article/details/7600906 https://blog.csdn.net/acm_JL/article/detail ...
- 批处理bat实现创建、复制、删除文件及文件夹
转自:http://blog.csdn.net/linda1000/article/details/10221285 1 建bat文件自动执行复制,删除命令. 例1:以下是复制cd.dll文件至win ...
- FreeRTOS软件定时器的使用
先贴上一个创建的代码,先声明一个句柄 TimerHandle_t pump_wakeup_timer_handle = NULL; 创建定时器和启动定时器,第三个参数,pdFALSE是只定时一次,pd ...
- Get Error when restoring database in Sql Server 2008 R2
When I restored a database I got an error: "The backup set holds a backup of a database ot ...
- ibatis常用sql
(1) 输入参数为单个值 <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" p ...