題意:給你乙個數列,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 2ac**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 }
洛谷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 ...