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 ...
随机推荐
- IDEA【 MyBatis Plugin】 插件免费完美运行
mybatis_plus.jar 包 .Install plugin from disk...导入即能用. BaiDu云: 链接: http://pan.baidu.com/s/1geKtTbP 密码 ...
- Python3 windows如何安装模块 setuptools
下载的module解压后里面有setup.py文件,如果打开setup.py文件里面有这段代码: from setuptools import setup ... setup( ... 这种的都需要调 ...
- mongo集群
http://blog.csdn.net/canot/article/details/50739359 http://blog.csdn.net/bluejoe2000/article/details ...
- nodepad++快捷键收集
Notepad++ 快捷键 大全Ctrl+C 复制Ctrl+X 剪切Ctrl+V 粘贴Ctrl+Z 撤消Ctrl+Y 恢复Ctrl+A 全选Ctrl+F 键查找对话框启动Ctrl+H 查找/替换对话框 ...
- [jQuery EasyUI系列] 创建增删改查应用
一.数据收集并妥善管理数据是网络应用共同的必要.CRUD允许我们生产页面列表并编辑数据库记录. 本文主要演示如何使用jQuery EasyUI实现CRUD DataGrid. 将使用到的插件有: da ...
- 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解
看了很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问,具体怎么做呢,看下面. 官方文档中提供的方法: If you d ...
- "此站点已经禁用应用程序"在sharepoint 2013中通过v2013部署app提示该错误
该错误的原文是:the apps are disabled in this site 可以在yahoo或者bing上搜索这个错误,可以找到解决办法: msdn上也有该错误解决办法,但是如果搜索中文,目 ...
- Linux System and Performance Monitoring
写在前面:本文是对OSCon09的<Linux System and Performance Monitoring>一文的学习笔记,主要内容是总结了其中的要点,以及加上了笔者自己的一些理解 ...
- iOS开发小技巧--即时通讯项目:消息发送框(UITextView)高度的变化; 以及UITextView光标复位的小技巧
1.即时通讯项目中输入框(UITextView)跟随输入文字的增多,高度变化的实现 最主要的方法就是监听UITextView的文字变化的方法- (void)textViewDidChange:(UIT ...
- Swift基础--可选绑定和守护绑定
Swift中的可选绑定和守护绑定 1.可选绑定 格式 // 通过url来创建request对象 if let tempUrl = url { // url为可选类型,当可选类型有值,才执行大括号里面的 ...