傳送門這題目是真的難讀......閱讀理解題啊......
但是理解了以後就發現,題目等價於:
給你乙個區間,支援單點修改,以及查詢一段區間的乘積的尤拉函式值,這個答案對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...