bzoj3813 奇數國 線段樹

2022-05-20 09:55:32 字數 1481 閱讀 6830

題目描述

給出乙個長度為n的序列,每個數都可以由前60個質數的乘積表示,初始每個數都是3。支援兩種操作:(1)修改乙個數 (2)查詢一段區間內所有數的乘積的尤拉函式值模19961993。

輸入第一行乙個整數x表示領袖清點和變動存款的總次數。

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

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

樣例輸入

6013

115013

117013

023樣例輸出

1824366

題解線段樹

考慮到$\varphi$的求法:$\varphi(n)=n\sum\limits_\fracp$。所以需要維護的就是區間乘積和區間所有出現過的質數。

由於所有數都可以由前60個質數表示,因此可以維護乘積中每個質數是否出現。使用二進位制位運算即可。

最後對於每個質因子計算並求出答案。

時間複雜度$o(60m+m\log n)$。

#include #define n 100010

#define mod 19961993

#define lson l , mid , x << 1

#define rson mid + 1 , r , x << 1 | 1

typedef long long ll;

const int n = 100000;

int p[60] , inv[60];

struct data

data(int x)

data operator+(const data &a)const

}a[n << 2];

inline void pushup(int x)

void build(int l , int r , int x)

int mid = (l + r) >> 1;

build(lson) , build(rson);

pushup(x);

}void update(int p , int v , int l , int r , int x)

int mid = (l + r) >> 1;

if(p <= mid) update(p , v , lson);

else update(p , v , rson);

pushup(x);

}data query(int b , int e , int l , int r , int x)

inline ll pow(ll x , int y)

return ans;

}inline bool judge(ll x)

inline void init()

int main()

} return 0;

}

bzoj3813 奇數國 線段樹 尤拉函式

傳送門這題目是真的難讀.閱讀理解題啊.但是理解了以後就發現,題目等價於 給你乙個區間,支援單點修改,以及查詢一段區間的乘積的尤拉函式值,這個答案對19961993取模 這裡是尤拉函式的原因顯然,題目中的那個不相沖實際上就是擴充套件歐幾里得裡面的那個定理,要滿足不相沖 也就是方程有解 product ...

尤拉函式 線段樹 奇數國

問題 b 奇數國 時間限制 1 sec 記憶體限制 256 mb 提交 82 解決 44 提交 狀態 討論版 題目描述 在一片美麗的大陸上有100000個國家,記為1到100000。這裡經濟發達,有數不盡的賬房,並且每個國家有乙個銀行。某大公司的領袖在這100000個銀行開戶時都存了3大洋,他惜財如...

BZOJ 4756 線段樹合併(線段樹)

思路 1.最裸的線段樹合併 2.我們可以觀察到子樹求乙個東西 那我們直接dfs序好了 入隊的時候統計一下有多少比他大的 出的時候統計一下 減一下 搞定 線段樹合併 by siriusren include include include using namespace std const int n...