bzoj3813 奇數國 線段樹 尤拉函式

2022-03-07 06:37:40 字數 1441 閱讀 9396

傳送門這題目是真的難讀......閱讀理解題啊......

但是理解了以後就發現,題目等價於:

給你乙個區間,支援單點修改,以及查詢一段區間的乘積的尤拉函式值,這個答案對19961993取模

這裡是尤拉函式的原因顯然,題目中的那個不相沖實際上就是擴充套件歐幾里得裡面的那個定理,要滿足不相沖(也就是方程有解),$product$和$number$必須互質

序列當中,每個元素大小不超過1e6,質因數都是前60個

那麼我們顯然可以開一棵線段樹來維護這個區間乘積,但是怎麼處理尤拉函式呢?$o(\sqrt)$的複雜度求嗎?但是這題可以到$1000000^$誒......

沒關係,我們來看乙個神秘小技巧

設乙個數$x=\prod_p_i$,那麼:

$\varphi(x)=\prod_(p_i-1)p_i=x\prod_^\frac$

那麼我們再開一棵線段樹,把60個質因數在對應區間裡的出現情況壓進乙個long long裡面

每次查詢的時候,查詢出來取模過的乘積,再對每個出現過的質因數乘上模意義下的$\frac$,就是答案了

#include#include#include#include#include#define ll long long

#define mp make_pair

using namespace std;

inline int read()

while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();

return re*flag;

}const ll mod=19961993;

ll qpow(ll a,ll b)

return re;

} int vis[310],pri[70],cntp,inv[70];

void init() }}

ll a[400010],bit[400010];//a是乘積,b是壓位的質因數狀態

void update(int num)

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

build(l,mid,num<<1);build(mid+1,r,(num<<1)+1);

update(num);

}void change(int l,int r,int num,int pos,ll val)

if(mid>=pos) change(l,mid,num<<1,pos,val);

else change(mid+1,r,(num<<1)+1,pos,val);

update(num);

}pairquery(int l,int r,int ql,int qr,int num)

if(midtmp;

init();

while(n--)

}}

bzoj3813 奇數國 線段樹

題目描述 給出乙個長度為n的序列,每個數都可以由前60個質數的乘積表示,初始每個數都是3。支援兩種操作 1 修改乙個數 2 查詢一段區間內所有數的乘積的尤拉函式值模19961993。輸入第一行乙個整數x表示領袖清點和變動存款的總次數。接下來x行,每行3個整數ai,bi,ci。ai為0時表示該條記錄是...

尤拉函式 線段樹 奇數國

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

BZOJ4869 相逢是問候(線段樹,尤拉定理)

bzoj 根據尤拉定理遞迴計算 類似上帝與集合的正確用法 所以我們可以用線段樹維護區間最少的被更新的多少次 如果超過了 的限制 就不用再計算了 如果需要計算就每次暴力算 這樣的複雜度o nlog 2 include include include include include include in...