題目描述
給出乙個長度為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...