線段樹 小花梨的陣列

2022-04-04 22:30:11 字數 1991 閱讀 8777

題目描述

小花梨得到了乙個長度為n的陣列a,現在要對它進行三種操作:

⚫1 l r對所有的i∈[l,r],a[i]=a[i]∗minprime(a[i])

⚫2 l r對所有的i∈[l,r],a[i]=a[i]/minprime(a[i])

⚫3 x

求a[x]的值

現在給出初始陣列a,對其進行m次操作,對於第三種操作輸出結果。

輸入第一行輸入兩個正整數n,m,表示陣列的長度以及操作次數(1≤n,m≤100000)

第二行輸入n個正整數表示陣列a(1≤ai≤1000000)

接下來m行表示m次操作,每行輸入格式為"1 l r"或者"2 l r",或者"3 x",對應上述三種操作。1≤l,r,x≤n,l≤r

輸出對於第三種操作輸出答案即可,答案對109+7進行取模。

複製樣例資料

5 8 

1 2 3 4 5

1 2 4

3 2

3 3

2 2 5

3 2

3 5

1 5 5

3 5

樣例輸出
492

11思路:線段樹維護乘和除的次數;op==1時,乘的次數直接加1,op==2時,先抵消乙個乘的次數,若乘全被抵消再給除的次數加1

#include#define mod 1000000007typedef 

long

long

ll;using

namespace

std;

int n,m,a[100010];//

區間長度

struct

nodenode_mul[

100010*4],node_div[100010*4];//

節點數=區間長度*4

void

cleartree(node node)

void build(node node,int k,int l,intr)}

void pushdown(node node,int f,int

k)

else

else

if(node_mul[2*k+1].lazy>=node[k].lazy)

else

node[k].sum-=node[k].sum*(node[k].r-node[k].l+1

); node[k].lazy=0

; }

}int ask_point_val(node node,int f,int k,intx)}

void addval_to_interval(node node,int f,int k,int l,int

r)

else

else

}}

else

}vector

factor[100010

];void get_primefactor(int

pos)

for(int i=2;i*i<=x;i++)

}}

if(x>1

) factor[pos].push_back(x);

}ll qpow(ll a,ll b)

return

ret;

}int

main()

build(node_mul,

1,1,n);build(node_div,1,1

,n);

for(int i=1;i<=m;i++)

else

if(op==2

)

else

printf(

"%lld\n

",ans);}}

return0;

}

view code

小花梨的陣列

probleme 小花梨的陣列 時間限制 1000ms 空間限制 512mb description 小花梨得到了乙個長度為n的陣列a,現在要對它進行三種操作 1 l r對所有的i l,r a i a i minprime a i 2 l r對所有的i l,r a i a i minprime a ...

小花梨的字串

小花梨有乙個長度為n且只包含小寫字母的字串。現在對其進行q次詢問。每次詢問字串的一段區間 l,r 從 l,r 區間內的所有子串中最多可以選出多少個字串,使得選出來的這些字串存在一種排列方式滿足相鄰的兩個字串a,b的最長公共字尾長度大於等於min strlen a strlen b 1。第一行輸入兩個...

博弈 小花梨的取石子遊戲

時間限制 1000ms 空間限制 512mb description 小花梨有 堆石子,第 堆石子數量為?堆石子順時針編號為 1 如圖 遊戲將進行?輪,每輪遊戲單獨進行,互不干擾,每輪初始時第?堆石子數目為?第?輪從編號為 的那堆石子為起點,順時針來取石子。兩人輪流取石子,不可不取,最少取 乙個石子...