Newcoder 128 C 尋寶(樹形DP)

2021-08-28 17:59:58 字數 1685 閱讀 1982

description

由依是戰線佯攻部隊的輔助人員,在岩澤消失之後,企圖代替岩澤成為gdm

gdmgd

m主唱。但是sss

sssss

s戰線的領袖仲村由理是不會輕易讓她加入的,於是由理子給了由依一項艱鉅的任務:去乙個地下迷宮尋找寶石!

這個迷宮由n

nn個房間組成,編號為0

00到n−1

n-1n−

1,每個房間裡都有一顆寶石,房間通過單向通道連線。每個房間裡有兩個門:乙個通向第r

rr個房間(r=

(a⋅v

2+b⋅

v+c)

modn

)(r=(a·v^2+ b·v + c)\ mod\ n)

(r=(a⋅

v2+b

⋅v+c

)mod

n),另乙個通向迷宮出口,一旦離開迷宮,便會觸發自毀機關,將再也沒有機會繼續收集寶石。現在,她可以在任何地點進入迷宮,沿隧道移動並收集寶石。

由依想盡可能地收集寶石,你能算出她能從迷宮中獲得的最大寶石數量是多少嗎?

input

輸入的第一行包含乙個整數t

tt,表示測試組數。

每個測試用例前面都有乙個空白行。

每個測試用例包含四個整數a,b

,c

a,b,c

a,b,c和nnn。

( t≤

10,n≤

224

)(t\le 10,n\le 2^)

(t≤10,

n≤22

4)output

對於每個測試用例輸出乙個數表示她可以從迷宮中獲取的最大寶石數量。

sample input

1 2 0 64

0 2 1 47

0 3 5 128

sample output5

2364

solution

每個點出度為1

11,故每個連通分支都是基環,首先找到環上所有點,從這些點出發的答案即為環上點的個數,之後對基環每點為根的樹直接往下轉移即可,時間複雜度o(n

)o(n)

o(n)

code

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

typedef long long ll;

typedef pairp;

#define maxn (1<<24)+5

int t,n,vis[maxn],dep[maxn],dp[maxn],sta[maxn],next[maxn],p,a,b,c;

int main()

for(int i=0;iif(!vis[i])

res-=dep[j];

if(vis[j]!=2)

}while(p)

}int ans=0;

for(int i=0;iprintf("%d\n",ans);

} return 0;

}

Newcoder 128 A 禮物(組合數學)

description 假設某個店鋪有n nn種不同型別的1 11元奧利奧和m mm種不同型別的2 22元奧利奧,而且餘量無限,我的錢有k kk元,我想把k kk元都用來買奧利奧,且可以買同型別的奧利奧,你能幫我算出有多少種購買方式嗎?設答案為z zz,這個數字也許會很大,所以我們只需要輸出zmo ...

Newcoder 128 F 填數字(貪心)

description 托公尺發現了一種新的遊戲 填數字 每填寫一次數字 1 i 9 1 le i le 9 1 i 9 需要花費a ia i ai 枚金幣,托公尺總共有n nn枚金幣.托公尺想知道他能得到的最大數字是多少.如果填不了請輸出 1 1 1。不需要用完所有金幣 input 第一行乙個數字...

Newcoder 128 B 麻婆豆腐(概率)

description 我手上有n nn枚硬幣,第i ii枚正面朝上的概率是p ip i pi 我現在每個硬幣各拋一次,正面朝上看做1 11,背面朝上看做0 00,把所有硬幣得到的數異或起來決定最後得到的數。問 有多少個子集合使得0 00和1 11的概率相等?input 輸入的第一行包含乙個整數t ...