【bzoj3813】: 奇数国

题意:给定一个序列,每个元素可以分解为最小的60个素数的形式。(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281)

支持单点修改,查询一段区间的积的欧拉函数 mod 19961993(是一个质数)。

线段树维护区间积x,bitset b[i]记录第i个素数是否存在。

预处理inv[i]=(p[i]-1)/p[i] mod 19961993

ans=x*inv[i] (b[i]==1)

 /* http://www.cnblogs.com/karl07/ */
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <bitset>
#define LL long long
using namespace std;
const int P=;
const int N=;
const int prime[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,};
const int inv[]={,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,}; struct data{
bitset <> b;
LL x;
data (LL x=){
if (x==){
this->x=;
this->b.reset();
}else{
this->x=x;
for (int i=;i<;i++){
if (!(x%prime[i])) this->b[i]=;
}
}
}
};
data operator + (const data &a,const data &b){
data c;
c.b=a.b|b.b; c.x=a.x*b.x%P;
return c;
}
struct seg{
data d;
seg *ls,*rs;
} t[N*+]; seg *root,*NEW=t;
seg *new1(){ return ++NEW;} #define mid (ll+rr)/2
void build(seg *p,int ll,int rr){
if (ll==rr){
p->d=data();
}else{
build(p->ls=new1(),ll,mid);
build(p->rs=new1(),mid+,rr);
p->d=p->ls->d+p->rs->d;
}
} void modify(seg *p,int ll,int rr,int x,data d){
if (ll==rr){
p->d=d;
}else{
if (x<=mid) modify(p->ls,ll,mid,x,d);
if (x>mid) modify(p->rs,mid+,rr,x,d);
p->d=p->ls->d+p->rs->d;
}
} data query(seg *p,int ll,int rr,int l,int r){
data ans=data();
if (l<=ll && r>=rr){
ans=ans+p->d;
}else{
if (l<=mid) ans=ans+query(p->ls,ll,mid,l,r);
if (r>mid) ans=ans+query(p->rs,mid+,rr,l,r);
}
return ans;
} LL cal(data d){
LL ans=d.x;
for (int i=;i<;i++){
if (d.b[i]==){
ans=ans*inv[i]%P;
}
}
return ans;
} int n; int main(){
scanf("%d",&n);
build(root=new1(),,N);
for (int i=;i<=n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if (a==){
printf("%lld\n",cal(query(root,,N,b,c)));
}else{
modify(root,,N,b,data(c));
}
}
return ;
}

【bzoj3813】: 奇数国 数论-线段树-欧拉函数的更多相关文章

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

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

  2. BZOJ 3813--奇数国(线段树&欧拉函数&乘法逆元&状态压缩)

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

  3. Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)

    题目链接 传送门 题面 思路 设\(x=\prod\limits_{i=l}^{r}a_i\)=\(\prod\limits_{i=1}^{n}p_i^{c_i}\) 由欧拉函数是积性函数得: \[ ...

  4. 线段树+欧拉函数——cf1114F

    调了半天,写线段树老是写炸 /* 两个操作 1.区间乘法 2.区间乘积询问欧拉函数 欧拉函数计算公式 phi(mul(ai))=mul(ai) * (p1-1)/p1 * (p2-1)/p2 * .. ...

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

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

  6. Please, another Queries on Array? CodeForces - 1114F (线段树,欧拉函数)

    这题刚开始看成求区间$\phi$和了........先说一下区间和的做法吧...... 就是说将题目的操作2改为求$(\sum\limits_{i=l}^{r}\phi(a[i]))\%P$ 首先要知 ...

  7. BZOJ4869 六省联考2017相逢是问候(线段树+欧拉函数)

    由扩展欧拉定理,a^(a^(a^(……^x)))%p中x作为指数的模数应该是φ(φ(φ(φ(……p)))),而p取log次φ就会变为1,也即每个位置一旦被修改一定次数后就会变为定值.线段树维护区间剩余 ...

  8. BZOJ 4026: dC Loves Number Theory 可持久化线段树 + 欧拉函数 + 数学

    Code: #include <bits/stdc++.h> #define ll long long #define maxn 50207 #define setIO(s) freope ...

  9. BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数

    BZOJ_4026_dC Loves Number Theory _主席树+欧拉函数 Description  dC 在秒了BZOJ 上所有的数论题后,感觉萌萌哒,想出了这么一道水题,来拯救日益枯 竭 ...

随机推荐

  1. type命令

    用途说明 type命令用来显示指定命令的类型.一个命令的类型可以是如下几种: alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命 ...

  2. mycat sequence

    数据库方式原理在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment int类型每次读取多少个sequence,假设 ...

  3. Excel开发学习笔记:VB.net的一些杂项

    遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多包涵. 开发环境基于VST ...

  4. Git 之Windows环境下学习系列

    Git .SVN .TFS   相同点 不同点 Git     版本控制 优点: 分布式版本控制.无需联网就能版本提交 开源 缺点 入门学习难度高 SVN   优点: 集中式版本控制. 个人开源 缺点 ...

  5. 数据校验(3)--demo2---bai

    input_user.jsp <%@ page language="java" import="java.util.*" pageEncoding=&qu ...

  6. CTF中常见文件的文件头(十六进制)

    jpg/jpeg FF D8 FF E0 或 FF D8 FF E1 或 FF D8 FF E8 png 89 50 4E 47 bmp 42 4D 36 5D gif 47 49 46 38 zip ...

  7. Solaris10如何确认DirectIO是否已经启用

    对于Oracle而言,如果数据库存储在UFS文件系统上,启用DirectIO能够提高数据库性能.Oracle有个参数filesystemio_options可以控制数据库是否使用DirectIO.  ...

  8. python pdb 基础调试

    当手边没有IDE,面对着python调试犯愁时,你就可以参考下本文:(pdb 命令调试) 参考:http://docs.python.org/library/pdb.html 和 (pdb)help ...

  9. springboot启动过程(1)-初始化

    1   springboot启动时,只需要调用一个类前面加了@SpringBootApplication的main函数,执行SpringApplication.run(DemoApplication. ...

  10. 学习Javascript的书籍(转)

    学习Javascript的书籍   作者: 阮一峰 日期: 2008年1月 9日 昨天,ppip同学留言: 你的js主要是用什么材料学的?推荐用哪本教程呢? 我想了一下,发现自己还真的读过不少书.我在 ...