传送门

欧拉函数+线段树

因为只有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: 奇数国的更多相关文章

  1. [BZOJ3813] 奇数国 - 线段树

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

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

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

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

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

  4. 【bzoj3813】: 奇数国 数论-线段树-欧拉函数

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

  5. [BZOJ 3813]奇数国

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

  6. AC日记——【清华集训2014】奇数国 uoj 38

    #38. [清华集训2014]奇数国 思路: 题目中的number与product不想冲: 即为number与product互素: 所以,求phi(product)即可: 除一个数等同于在模的意义下乘 ...

  7. Bzoj 3813 奇数国 题解 数论+线段树+状压

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

  8. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)

    HYSBZ - 3813奇数国 中文题,巨苟题,巨无敌苟!!首先是关于不相冲数,也就是互质数的处理,欧拉函数是可以求出互质数,但是这里的product非常大,最小都2100000,这是不可能实现的.所 ...

  9. 【BZOJ3813】【清华集训2014】奇数国 线段树 数学

    题目描述 给你一个长度为\(n\)的数列,第\(i\)个数为\(a_i\).每个数的质因子都只有前\(60\)个质数.有\(q\)个询问,每次给你\(l,r\),求\(\varphi(\prod_{i ...

随机推荐

  1. hibernate Expression详解

    关键字: hibernate expression hibernate Expression详解Expression.gt:对应SQL条件中的"field > value " ...

  2. Javascript的精华啊【如果以后我看到了或者想到了再继续补吧】

    我不过略有一些讨人喜欢的地方而已,怎么会有什么迷人的魔力呢? 一.语法 JS只有一个数字类型,64位浮点数,所以1和1.0是相同的.为什么这么设计:防止短整型的溢出. 二.对象 1.通常将一个对象的值 ...

  3. OS存储器管理(二)

    离散分配 分页(Paging),分段,段页式 一.分页   一个进程的物理地址可以是非连续的:   将物理内存分成固定大小的块,称为块(frame): 将逻辑内存分为同样大小的块,称为页(page): ...

  4. sql server 字符串函数str()

    语法: STR(nExpres[,nLength[,nDecimalPlaces]]) 参数: nExpression------STR要计算的数值表达式. nLength------------ST ...

  5. JavaScript学习笔记-new Date() 与 Date() 的区别

    var today1 = Date() //返回一个字符串(string),没有getDate等日期对象方法,内容为当前时间 var today2 = new Date() //返回一日期对象,内容为 ...

  6. Sublime轻量级编辑器

    对于从事计算机的小伙伴,好用的编辑器等效于手里的利器!可说为,砍柴不误,磨刀工! 手有神器,游走四方! sublime,记得好像是支持跨平台的 家乡的情绪 http://pan.baidu.com/s ...

  7. 【JavaEE企业应用实战学习记录】MyGetAttributeListener

    package sanglp.servlet; import javax.servlet.ServletContext; import javax.servlet.ServletContextAttr ...

  8. Beta版本冲刺——day1

    No Bug 031402401鲍亮 031402402曹鑫杰 031402403常松 031402412林淋 031402418汪培侨 031402426许秋鑫 站立式会议 培侨走的第4天,想他~( ...

  9. Java的反射机制(Reflection)

    反射机制 指可以在运动时加载.探知.使用编译期间完全未知的类 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够获取这个类的属性和方法:对于任意一个对象可以调用它的任意一个 ...

  10. 多词查询(Multi-word Queries)

    如果我们一次只能搜索一个词,那么全文搜索就会显得相当不灵活.幸运的是,通过match查询来实现多词查询也同样简单: GET /my_index/my_type/_search { "quer ...