BZOJ3813: 奇数国
欧拉函数+线段树
因为只有60个素数,所以把状态压成long long的形式。用线段树维护区间和和区间和中有多少个质数。然后xjb搞搞就行了,具体参见代码。
//BZOJ 3813 //by Cydiater //2016.10.10 #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> #include <queue> #include <map> #include <ctime> #include <cstring> #include <string> #include <algorithm> #include <iomanip> using namespace std; #define ll long long #define up(i,j,n) for(ll i=j;i<=n;i++) #define down(i,j,n) for(ll i=j;i>=n;i--) const ll MAXN=1e6+5; const ll oo=1LL<<60; const ll mod=19961993; const ll LIM=1e6; const ll N=1e5; inline ll read(){ char ch=getchar();ll x=0,f=1; while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } ll inv[MAXN],prime[MAXN],cnt=0,T,x,y,k,v; struct Tree{ ll S,v; }t[MAXN<<2]; bool vis[MAXN]; namespace solution{ void exgcd(ll a,ll b,ll &x,ll &y){ if(b==0){x=1;y=0;return;} exgcd(b,a%b,x,y); ll t=x;x=y;y=t-a/b*y; } ll get_inv(ll a,ll b){ ll x,y; exgcd(a,b,x,y); while(x<0)x+=b; return x; } ll get_suf(ll S){ ll ans=1; up(i,0,59)if((1LL<<i)&S) ans=(ans*(prime[i+1]-1)%mod*inv[i+1]%mod)%mod; return ans; } ll get_two(ll num){ ll S=0; up(i,1,60)if(num%prime[i]==0)S|=(1LL<<(i-1)); return S; } Tree merge(Tree x,Tree y){ x.S|=y.S; (x.v*=y.v)%=mod; return x; } void pret(){ memset(vis,0,sizeof(vis)); up(i,2,LIM){ if(!vis[i])prime[++cnt]=i; up(j,1,cnt){ if(prime[j]*i>LIM)break; vis[i*prime[j]]=1; if(i%prime[j]==0)break; } } up(i,1,60)inv[i]=get_inv(prime[i],mod); } void build(int leftt,int rightt,int root){ if(leftt==rightt){ t[root].S=1<<1; t[root].v=3; return; } int mid=(leftt+rightt)>>1; build(leftt,mid,root<<1); build(mid+1,rightt,root<<1|1); t[root].S=t[root<<1].S|t[root<<1|1].S; t[root].v=t[root<<1].v*t[root<<1|1].v%mod; } Tree get(int leftt,int rightt,int root){ if(leftt>y||rightt<x) return (Tree){0,1}; if(leftt>=x&&rightt<=y) return t[root]; int mid=(leftt+rightt)>>1; Tree tmp=merge(get(leftt,mid,root<<1),get(mid+1,rightt,root<<1|1)); return tmp; } void updata(int leftt,int rightt,int root){ if(leftt>k||rightt<k) return; if(leftt==rightt){ t[root].v=v; t[root].S=get_two(v); return; } int mid=(leftt+rightt)>>1; updata(leftt,mid,root<<1); updata(mid+1,rightt,root<<1|1); t[root]=merge(t[root<<1],t[root<<1|1]); } void slove(){ T=read(); while(T--){ ll a=read(),b=read(),c=read(); if(a==0){ x=b;y=c; Tree tmp=get(1,N,1); printf("%lld\n",tmp.v*get_suf(tmp.S)%mod); }else{ k=b;v=c; updata(1,N,1); } } } } int main(){ //freopen("input.in","r",stdin); using namespace solution; pret(); build(1,N,1); slove(); 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】: 奇数国 数论-线段树-欧拉函数
[bzoj3813]: 奇数国 题意:给定一个序列,每个元素可以分解为最小的60个素数的形式.(x=p1^k1*p2^k2*......p60^k60)(p1=2,p2=3,…,p60=281) 支持 ...
- [BZOJ 3813]奇数国
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 736 Solved: 416[Submit][Status][Discuss] ...
- AC日记——【清华集训2014】奇数国 uoj 38
#38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...
- Bzoj 3813 奇数国 题解 数论+线段树+状压
3813: 奇数国 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 748 Solved: 425[Submit][Status][Discuss] ...
- HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)
HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...
- 【BZOJ3813】【清华集训2014】奇数国 线段树 数学
题目描述 给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\).每个数的质因子都只有前\(60\)个质数.有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i ...
随机推荐
- fstab 中 通过UUID挂载 参数解释
UUID=cf474122-1d51-4953-846d-9ce1c8d23ae6 / ext4 defaults 1 1UUID=ef21d494-0dc7-41ec-95b2-a691bfd4e5 ...
- 生成短链(网址) ShortUrlLink
建表 CREATE TABLE [dbo].[ShortUrl]( [Id] [,) NOT NULL, [LongUrl] [nvarchar]() NOT NULL, [BaseUri] [int ...
- mac 设置阿里企业邮箱
接收邮件服务器:pop3.mxhichina.com或pop3.您的域名,端口:110 发送邮件服务器:smtp.mxhichina.com或smtp.您的域名,端口:25 IMAP协议设置 接收邮件 ...
- SpringMVC学习--springmvc原理
简介 springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合.springmvc是一个基于mvc的web框架. spring的结构图: mvc在b/ ...
- pdo简单操作
PDO(PHP Data Object) 是PHP 5新出来的东西,在PHP 6都要出来的时候,PHP 6只默认使用PDO来处理数据库,将把所有的数据库扩展移到了PECL,那么默认就是没有了我们喜爱的 ...
- springMVC自定义注解实现用户行为验证
最近在进行项目开发的时候需要对接口做Session验证 1.自定义一个注解@AuthCheckAnnotation @Documented @Target(ElementType.METHOD) @I ...
- Ubuntu 14.04 安装 JDK 8,ubuntu14.04
第一步,下载Linux版JDK 可以通过访问Oracle官网下载,或者直接通过命令行下载. lxh@ubuntu:~$ wget -c http://download.oracle.com/otn-p ...
- openvpn的部署
http://www.gaohuirong.cn/openvpn/2016/04/12/linux-install-openvpn.html
- [转]Hibernate时间总结
原文地址:http://blog.csdn.net/woshisap/article/details/6543027 1:Hibernate操作时间需要注意的问题 hibernate很大的一个特点就是 ...
- 美化select下拉框
直接上干货: 需要的材料: change_select.js (文末会给出下载地址) 使用方法: 1.调用方法:<script type="text/javascript" ...