Newcoder 38 C 隨機樹(線段樹)

2021-08-29 20:39:11 字數 3230 閱讀 8056

description

平日裡寫has

hhash

hash

的時候,總有某些選手由於臉黑而導致慘遭卡模數,然後一些惡意卡模數的出題人也因此身敗名裂。為了防止被卡,我們用一種高階的隨機方式來代替原來的線性隨機生成,也就是所謂的隨機樹!

現在有一棵編號為0

00~n−1

n-1n−

1的有根樹,其中0

00是樹的根。每個節點初始有乙個值t

it_i

ti​。現在要求支援一下兩種操作:

1.

1.1.

給出兩個正整數u

uu和x

xx,我們將t

ut_u

tu​的值乘以x

xx,我們將這種操作稱為see

dseed

seed

操作。2.

2.2.

給出乙個正整數i

ii,詢問s

is_i

si​以及它一共有多少個正約數。其中s

is_i

si​表示以i

ii為根的子樹所有點的權值的乘積,我們將這種操作稱為ran

drand

rand

操作。容易發現,這樣得到的答案還是很隨機的。(其實不是)

你需要回答每一次的詢問,由於乙個數的約數個數可能非常多,這個數也可以非常大,你只需要把答案對109

+7

10^9+7

109+

7取模就可以了。

input

第一行乙個正整數n

nn,表示節點個數。

接下來n−1

n-1n−

1行,每行兩個正整數u

uu和v

vv,表示u

uu是v

vv的父節點。

接下來一行n

nn個正整數,分別表示每個節點的初始權值t

it_i

ti​。

接下來一行乙個正整數q

qq,表示操作的個數。

接下來q

qq行,每行是以下兩種情況之一:

1. se

edux

1.seed\ u\ x

1.seed

ux: 表示將u

uu節點的權值乘以xxx。

2. ra

nd

i2.rand\ i

2.rand

i: 表示詢問s

is_i

si​以及它一共有多少個正約數。

資料保證在任意時刻,每個點的權值不可能擁有超過13

1313

的素因子,也就是說,每個數的素因子最多只有2,3

,5,7

,11,13

2,3,5,7,11,13

2,3,5,

7,11

,13這六種可能。

( 1≤

n,q≤

105,

1≤x≤

109)

(1\le n,q\le 10^5,1\le x\le 10^9)

(1≤n,q

≤105

,1≤x

≤109

) output

每一行兩個整數,對應乙個ran

drand

rand

操作,你需要輸出所求的權值以及它的正約數個數,答案對於109

+7

10^9+7

109+

7取模即可。

sample input8

0 10 2

1 32 4

2 53 6

3 77 3 10 8 12 14 40 15

3rand 1

seed 1 13

rand 1

sample output

14400 63

187200 126

solution

線段樹維護區間中每個素因子冪指數之和,支援單點修改和區間求和,時間複雜度o(6

(n+q

)log

n)

o(6(n+q)logn)

o(6(n+

q)lo

gn)

code

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

typedef pairp;

const int inf=0x3f3f3f3f,maxn=100005;

#define mod 1000000007

int add(int x,int y)

int mul(int x,int y)

int pow(int x,int y)

return ans;

}int p=;

#define ls (t<<1)

#define rs ((t<<1)|1)

struct node

node operator+(const node &b)const

int val()

}t[maxn<<2];

void push_up(int t)

void modify(int x,int l,int r,int t,node v)

int mid=(l+r)/2;

if(x<=mid)modify(x,l,mid,ls,v);

else modify(x,mid+1,r,rs,v);

push_up(t);

}node query(int l,int r,int l,int r,int t)

node solve(int n)

int n,m,a[maxn],l[maxn],r[maxn],dfn=0;

vectorg[maxn];

void dfs(int u)

int main()

dfs(0);

for(int i=0;iscanf("%d",&m);

while(m--)

else

}return 0;

}

Newcoder 128 C 尋寶(樹形DP)

description 由依是戰線佯攻部隊的輔助人員,在岩澤消失之後,企圖代替岩澤成為gdm gdmgd m主唱。但是sss sssss s戰線的領袖仲村由理是不會輕易讓她加入的,於是由理子給了由依一項艱鉅的任務 去乙個地下迷宮尋找寶石 這個迷宮由n nn個房間組成,編號為0 00到n 1 n 1n...

Newcoder 70 C 幸運數字 (水 )

description 定義乙個數字為幸運數字當且僅當它的所有數字都是4 44或者777。比如說,47 744 4 47 744 4 47 744 4都是幸運數字而5 17 467 5 17 467 5 17 4 67都不是。假設現在有乙個數字d dd,現在想在d dd上重複k kk次操作。假設d ...

Leetcode 38 外觀數列 C

外觀數列 是乙個整數序列,從數字 1 開始,序列中的每一項都是對前一項的描述。前五項如下 1.1 2.11 3.21 4.1211 5.1112211 被讀作 one 1 乙個一 即 11。11 被讀作 two 1s 兩個一 即 21。21 被讀作 one 2 one 1 乙個二 乙個一 即 121...