[bzoj3813]奇数园
仿佛现在已经完成了做题之前先开个坑的习惯,也许是为了逼迫自己去刷一些神题吧。。。然并卵,该剩的好多坑还是剩着呢。
【bzoj3813】一道线段树好题。已经把数论忘光光了。
欧几里德算法
扩展欧几里德算法概述
= n / (p1 * p2 * p3 * …… * pn) * ((p1 - 1) * (p2 - 1) * (p3 - 1) * …… * (pn - 1))
这道题也是uoj的#38,uoj的blog上面有比较详细的解法,我看的陆爷的blog感觉写得蛮优美..
关于φ的求法有很多种,这里数字*π(pri[i]-1)/pri[i]即答案。只要60位记录一下状态即可。
呵呵哒,又get到一种逆元的新求法,不过没关系啦,考试的时候忘记了大不了写个quickmi
#include<cstdio> #include<algorithm> #define ll long long #define mo 19961993 #define N 400050 using namespace std; ,n,tot=; ll ni[],pri[]; struct node{ int l,r; ll v; }tree[][]; void calc(int f,int k,int val) { )tree[f][k].v=val; else { tree[f][k].v=; ;i<=;i++) )tree[f][k].v+=1ll<<(i-); } } void update(int f,int p) { )tree[f][p].v=tree[f][p+p].v*tree[f][p+p+].v%mo; ].v; } void build(int f,int p,int l,int r) { tree[f][p].l=l;tree[f][p].r=r;; if(l==r){ calc(f,p,);return; } build(f,p+p,l,mid); build(f,p+p+,mid+,r); update(f,p); } ll que(int f,int p,int x,int y) { ; if(x==l&&r==y)return tree[f][p].v; if(y<=mid)return que(f,p+p,x,y); ,x,y); else{ ),mid+,y)%mo; ,mid+,y); } } ll query(int xx,int yy) { ll tmp1=que(,,xx,yy),tmp2=que(,,xx,yy); ;i<=;i++) ))) tmp1 = tmp1*(pri[i]-) % mo * ni[pri[i]] %mo; return tmp1; } void change(int p,int x,int y) { ][p].l==x&&tree[][p].r==x){ tree[][p].v=y;tree[][p].v=; ;i<=;i++) )tree[][p].v+=1ll<<(i-); return; } ][p].l+tree[][p].r)/; ,x,y); tree[][p].v=tree[][p+p].v*tree[][p+p+].v%mo; tree[][p].v=tree[][p+p].v|tree[][p+p+].v; } int main() { ni[]=; int flag[N]; ;i<M;i++) { ni[i] = -mo/i * ni[mo%i] % mo; ni[i]=(ni[i]+mo)%mo; ){tot++;pri[tot]=i;} ;j<=tot;j++) { if(i*pri[j]>M)break; flag[i*pri[j]]=; )break; } } build(,,,); build(,,,); scanf("%d",&n); ;i<=n;i++) { int op,x,y; scanf("%d%d%d",&op,&x,&y); )printf("%lld\n",query(x,y)); ,x,y); } }
bzoj3813
这道题下午吃完午饭来写,困到最后只剩手在动也没啥知觉了。。。不写挂真是谢天谢地!
[bzoj3813]奇数园的更多相关文章
- [BZOJ3813] 奇数国 - 线段树
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 912 Solved: 508[Submit][Status][Discuss] ...
- BZOJ3813: 奇数国
传送门 欧拉函数+线段树 因为只有60个素数,所以把状态压成long long的形式.用线段树维护区间和和区间和中有多少个质数.然后xjb搞搞就行了,具体参见代码. //BZOJ 3813 //by ...
- [bzoj3813] 奇数国 [线段树+欧拉函数]
题面 传送门 思路 这题目是真的难读......阅读理解题啊...... 但是理解了以后就发现,题目等价于: 给你一个区间,支持单点修改,以及查询一段区间的乘积的欧拉函数值,这个答案对19961993 ...
- 【BZOJ3813】奇数国 线段树+欧拉函数
[BZOJ3813]奇数国 Description 给定一个序列,每次改变一个位置的数,或是询问一段区间的数的乘积的phi值.每个数都可以表示成前60个质数的若干次方的乘积. Sample Input ...
- 【bzoj3813】: 奇数国 数论-线段树-欧拉函数
[bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...
- 【BZOJ3813】【清华集训2014】奇数国 线段树 数学
题目描述 给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\).每个数的质因子都只有前\(60\)个质数.有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i ...
- 【bzoj3813】奇数国 线段树
题目描述 给出一个长度为n的序列,每个数都可以由前60个质数的乘积表示,初始每个数都是3.支持两种操作:(1)修改一个数 (2)查询一段区间内所有数的乘积的欧拉函数值模19961993. 输入 第一行 ...
- 剑指Offer面试题:13.调整数组顺序使奇数位于偶数前面
一.题目:调整数组顺序使奇数位于偶数前面 题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 例如有以下一个整数数组:12345 ...
- ZooKeeper 02 - ZooKeeper集群的节点为什么是奇数个
目录 1 关于节点个数的说明 2 ZooKeeper集群的容错数 3 ZooKeeper集群可用的标准 4 为什么不能是偶数个节点 4.1 防止由脑裂造成的集群不可用 4.2 奇数个节点更省资源 4. ...
随机推荐
- php正则表达式、数组
<?php $s = "he8llo5wor6ld"; $s = preg_replace("/\d/","#",$s);按照正则表达 ...
- object实现小老鼠交互
直接使用 <p style="text-align: center; "> <object type="application/x-shockwave- ...
- Redis事件管理(一)
Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test ...
- Swing开发之JComboBox篇
http://blog.csdn.net/sjf0115/article/details/6991579
- 在Linux中安装JDK的步骤
相信不少学习Java的朋友都在Windows操作系统中安装过JDK,这里就不对JDK做详细的介绍了. 在Windows下安装JDK可参考:JDK的安装和配置 1.下载JDK 我们可以去官网(http: ...
- 20145206邹京儒《Java程序设计》第4周学习总结
20145206 <Java程序设计>第4周学习总结 教材学习内容总结 第六章 6.1 何谓继承 继承基本上就是避免多个类间重复定义共同行为 package cc.openhome; pu ...
- drozer unknown module处理办法
将目录切换到drozer安装目录,然后在执行:
- php文件上传进度条例子
<?php session_start(); ?> <!DOCTYPE html> <html lang="zh-CN"> <head&g ...
- Windows 8使用这半年(企业版)
2014-06-23 硬件:thinkpad e430c core i5-3210m 4g/500g 1.Windows 8出现开机引导问题 主要开机的时候提示缺少引导文件,按ctrl+alt+del ...
- 【JAVA单例模式详解】
设计模式是一种思想,适合于任何一门面向对象的语言.共有23种设计模式. 单例设计模式所解决的问题就是:保证类的对象在内存中唯一. 举例: A.B类都想要操作配置文件信息Config.java,所以在方 ...