題目描述
小花梨得到了乙個長度為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
49211思路:線段樹維護乘和除的次數;op==1時,乘的次數直接加1,op==2時,先抵消乙個乘的次數,若乘全被抵消再給除的次數加1
#include#define mod 1000000007typedefview codelong
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;
}
小花梨的陣列
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 如圖 遊戲將進行?輪,每輪遊戲單獨進行,互不干擾,每輪初始時第?堆石子數目為?第?輪從編號為 的那堆石子為起點,順時針來取石子。兩人輪流取石子,不可不取,最少取 乙個石子...