奇數國題解

2022-06-04 03:48:07 字數 1289 閱讀 7333

原題

雖然 \(ntf\) 學長嘲諷了這道題,但我認為這道題很適合我(菜雞)了解線段樹的有趣用法

首先翻譯題面,就是每次進行乙個操作——詢問乙個區間內所有數的乘積的尤拉函式或者修改數列中的乙個數

由於每個數上限是\(10^6\),暴力求完乙個區間的乘積再套尤拉函式是不可能的

首先了解先尤拉函式的公式

\[φ(x)=x*\prod_^{})}

\]看到這個公式,發現我們其實沒有必要求出區間數的乘積,我們只需要知道這個乘積裡會有幾個不同的質數就可以了

然後每個數不超過\(10^6\),所以會出現的質數不超過\(60\)個,可以狀態壓縮

用乙個\(f\)陣列記錄取模後的區間乘積,用乙個\(ff\)記錄區間內出現的質數種類的狀壓,每次查詢乙個區間的這兩個值就能求出這個區間乘積的尤拉函式

下面說下具體過程,不想劇透的小夥伴可以開始敲**了

#include#include#include#include#define mid ((l+r)/2)

#define ll long long

using namespace std;

const ll p=;

const ll inv=;

const ll mod=19961993;

ll n,f[8000010],ff[8000010];

void build(ll l,ll r,ll o)

build(l,mid,o*2);

build(mid+1,r,o*2+1);

f[o]=f[o*2]|f[o*2+1];

ff[o]=ff[o*2]*ff[o*2+1]%mod;

}void modify(ll l,ll r,ll o,ll x,ll d,ll d2)

if(x<=mid)modify(l,mid,o*2,x,d,d2);

else modify(mid+1,r,o*2+1,x,d,d2);

f[o]=f[o*2]|f[o*2+1];

ff[o]=ff[o*2]*ff[o*2+1]%mod;

}ll query(ll l,ll r,ll o,ll i,ll j)

ll ret=1;

if(i<=mid)ret=ret*query(l,mid,o*2,i,j)%mod;

if(mid>n;

for(ll i=1;i<=100000;i++)modify(1,100000,1,i,2,3);

while(n--)

}printf("%lld\n",ans);

} }}

尤拉函式 線段樹 奇數國

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

bzoj3813 奇數國 線段樹

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

bzoj3813 奇數國 線段樹 尤拉函式

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