洛谷P3306 隨機數生成器

2022-04-30 09:33:10 字數 1456 閱讀 6704

題意:給你乙個數列,a1 = x,ai = (a * ai-1 + b) % p,求第乙個是t的是哪一項,或者永遠不會有t。

解:迴圈節不會超過p。我們使用bsgs的思想,預處理從t開始跳√p步的,插入hash表內。

然後每次把a1跳√p步,來看是否在hash表中存在。

這樣發現我們有40,wa了60分。為什麼呢?考慮是否存在兩個數x和y,它們跳一次之後一樣了。發現這種情況只會出現在a = 0的時候,於是特判掉a = 0。可獲得100分。

1 #include 2

3const

int n = 100010;4

5int

mo, a, b, op, aim;

67 inline int qpow(int a, int

b) 13 a = 1ll * a * a %mo;

14 b = b >> 1;15

}16return

ans;17}

1819

namespace

hash node[n]; int

tp;23

const

int mod = 999983;24

inte[mod];

25 inline void

clear()

30 inline void insert(int v, int

id) 37}

38 node[++tp].nex =e[x];

39 node[tp].v =v;

40 node[tp].id =id;

41 e[x] =tp;

42return;43

}44 inline int find(int

v) 50}51

return -1;52

}53}54

55 inline void

solve()

62if(a == 0

) 66

else

69return;70

}71int t = sqrt((double

)mo);

72for(int i = 0; i < t; i++)

77int c =qpow(a, t), d;

78if(a == 1

) 81

else

84//

printf("c = %d d = %d \n", c, d);

85for(int i = 1; (i - 1) * t < mo; i++) 93}

94 printf("

-1\n");

95return;96

}9798int

main()

104return0;

105 }

ac**

洛谷P2044 隨機數生成器

棟棟最近迷上了隨機演算法,而隨機數是生成隨機演算法的基礎。棟棟準備使用線性同餘法 linear congruential method 來生成乙個隨機數列,這種方法需要設定四個非負整數引數m,a,c,x 0 按照下面的公式生成出一系列隨機數 x n 1 ax n c mod m 用這種方法生成的序列...

洛谷 P3600 隨機數生成器(期望 dp)

題面傳送門 我竟然獨立搞出了這道黑題!incredible!u1s1 這題是我做題時間跨度最大的題之一 首先講下我四個月前想出來的 n 2 log n 的做法吧。記 f a max limits q min limits a j x 首先期望轉概率,設 p i 表示 f a x 的概率,答案即為 s...

洛谷P2044 NOI2012 隨機數生成器

數列 x ax n c bmod m 其中 a,c 是給定的常數,n 0 x 0 的值已給出。然後呢,你需要求出 x n bmod g n,m,a,c,x 0 leq10 g leq 10 8 構造列向量 c n begin1 x n end 然後,構造轉移矩陣 begin1 0 c a endc ...