国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj 3813: 奇數國 (線段樹+質因數分解+線性篩+線性逆元)

2019-11-08 19:39:56
字體:
來源:轉載
供稿:網友

3813: 奇數國

Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 502  Solved: 295[Submit][Status][Discuss]

Description

在一片美麗的大陸上有100000個國家,記為1到100000。這里經濟發達,有數不盡的賬房,并且每個國家有一個銀行。某大公司的領袖在這100000個銀行開戶時都存了3大洋,他惜財如命,因此會不時地派小弟GFS清點一些銀行的存款或者讓GFS改變某個銀行的存款。該村子在財產上的求和運算等同于我們的乘法運算,也就是說領袖開戶時的存款總和為3100000。這里發行的軟妹面額是最小的60個素數(p1=2,p2=3,…,p60=281),任何人的財產都只能由這60個基本面額表示,即設某個人的財產為fortune(正整數),則fortune=p1^k1*p2^k2*......p60^K60。領袖習慣將一段編號連續的銀行里的存款拿到一個賬房去清點,為了避免GFS串通賬房叛變,所以他不會每次都選擇同一個賬房。GFS跟隨領袖多年已經摸清了門路,知道領袖選擇賬房的方式。如果領袖選擇清點編號在[a,b]內的銀行財產,他會先對[a,b]的財產求和(計為PRoduct),然后在編號屬于[1,product]的賬房中選擇一個去清點存款,檢驗自己計算是否正確同時也檢驗賬房與GFS是否有勾結。GFS發現如果某個賬房的編號number與product相沖,領袖絕對不會選擇這個賬房。怎樣才算與product不相沖呢?若存在整數x,y使得number*x+product*y=1,那么我們稱number與product不相沖,即該賬房有可能被領袖相中。當領袖又賺大錢了的時候,他會在某個銀行改變存款,這樣一來相同區間的銀行在不同的時候算出來的product可能是不一樣的,而且領袖不會在某個銀行的存款總數超過1000000。現在GFS預先知道了領袖的清點存款與變動存款的計劃,想請你告訴他,每次清點存款時領袖有多少個賬房可以供他選擇,當然這個值可能非常大,GFS只想知道對19961993取模后的答案。

Input

第一行一個整數x表示領袖清點和變動存款的總次數。接下來x行,每行3個整數ai,bi,ci。ai為0時表示該條記錄是清點計劃,領袖會清點bi到ci的銀行存款,你需要對該條記錄計算出GFS想要的答案。ai為1時表示該條記錄是存款變動,你要把銀行bi的存款改為ci,不需要對該記錄進行計算。

Output

輸出若干行,每行一個數,表示那些年的答案。

Sample Input

6013115013117013023

Sample Output

1824366explanation初始化每個國家存款都為3;1到3的product為27,[1,27]與27不相沖的有18個數;1的存款變為5;1到3的product為45,[1,45]與45不相沖的有24個數;1的存款變為7;1到3的product為63,[1,63]與63不相沖的有36個數;2到3的product為9,[1,9]與9不相沖的有6個數。

HINT

x≤100000,當ai=0時0≤ci?bi≤100000

Source

2015年國家集訓隊測試

[Submit][Status][Discuss]


題解:線段樹+質因數分解+線性篩+線性逆元

對于所有位置的數質因數分解,然后維護區間中質因數的出現次數。

number*x+product*y=1 => number*x=1 (mod product) 

同余方程有解,當且僅當number,product互質。

所有我們要求的就是[1,product]中與product互質的數的個數,即phi(product)

然后利用公式求解即可。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 100003#define p 19961993#define LL long longusing namespace std;LL mp[303],pd[303],prime[303],inv[303];struct data {	int cnt[63];	data() {		memset(cnt,0,sizeof(cnt));	}}tr[N*4];int n;void init(){	for (int i=2;i<=300;i++) {		if (!pd[i]) prime[++prime[0]]=i,mp[i]=prime[0];		for (int j=1;j<=prime[0];j++) {			if (prime[j]*i>300) break;			pd[prime[j]*i]=1;			if (i%prime[j]==0) break;		}	}	prime[0]=60;	inv[0]=inv[1]=1;	for (int i=2;i<=281;i++) 	 inv[i]=(p-p/i)*inv[p%i]%p;	//for (int i=2;i<=261;i++) cout<<inv[i]<<" ";	//cout<<endl;}void update(int now){	for (int i=1;i<=60;i++) tr[now].cnt[i]=tr[now<<1].cnt[i]+tr[now<<1|1].cnt[i];}void build(int now,int l,int r){	if (l==r) {		memset(tr[now].cnt,0,sizeof(tr[now].cnt));		tr[now].cnt[2]=1;		return;	}	int mid=(l+r)/2;	build(now<<1,l,mid);	build(now<<1|1,mid+1,r);	update(now);}void add(data &a,data b){	for (int i=1;i<=60;i++)	 a.cnt[i]+=b.cnt[i];}data query(int now,int l,int r,int ll,int rr){	if (ll<=l&&r<=rr) return tr[now];	int mid=(l+r)/2; data a; 	if (ll<=mid) add(a,query(now<<1,l,mid,ll,rr));	if (rr>mid) add(a,query(now<<1|1,mid+1,r,ll,rr));	return a;}void pointchange(int now,int l,int r,int x,int val){	if (l==r) {		memset(tr[now].cnt,0,sizeof(tr[now].cnt));		int k=val;		for (int i=1;prime[i]*prime[i]<=k;i++) 		 if (k%prime[i]==0) {		 	while (k%prime[i]==0) k/=prime[i],tr[now].cnt[i]++;		 }		if (k>1) tr[now].cnt[mp[k]]++;		return;	}	int mid=(l+r)/2;	if (x<=mid) pointchange(now<<1,l,mid,x,val);	else pointchange(now<<1|1,mid+1,r,x,val);	update(now);}LL quickpow(LL num,int x){	LL base=num%p; LL ans=1;	while (x) {		if (x&1) ans=ans*base%p;		x>>=1;		base=base*base%p;	}	return ans;}int main(){	freopen("a.in","r",stdin);	freopen("my.out","w",stdout);	init(); int T;	scanf("%d",&T); n=100000;	build(1,1,n);	for (int i=1;i<=T;i++) {		int opt,x,y;		scanf("%d%d%d",&opt,&x,&y);		if (opt==0) {		  data a=query(1,1,n,x,y);		  LL ans=1;		  for (int j=1;j<=60;j++)		   if (a.cnt[j]) 		    ans=ans*quickpow(prime[j],a.cnt[j])%p*(LL)(prime[j]-1)%p*inv[prime[j]]%p;		    //cout<<quickpow(prime[j],a.cnt[j])%p<<" "<<inv[prime[j]]<<endl;		  printf("%I64d/n",ans%p);	    }	    else pointchange(1,1,n,x,y);	}}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 合水县| 秦安县| 集安市| 武定县| 福贡县| 安庆市| 青铜峡市| 霍城县| 延庆县| 宜春市| 安吉县| 山西省| 那坡县| 凌云县| 河南省| 西藏| 紫云| 五大连池市| 青冈县| 靖西县| 遂溪县| 潼南县| 天柱县| 冕宁县| 广元市| 黔江区| 阿拉尔市| 巫山县| 库伦旗| 平定县| 平乡县| 天峻县| 东安县| 报价| 神木县| 乌兰浩特市| 黔江区| 崇义县| 大余县| 江山市| 全椒县|