oj#
10041
\rm loj~\#10041
loj#10
041
這道題有三種解法,一本通的編排為我們提示了其中唯一一種會被卡的解法 (mmp) 1.
雜湊表\large \textbf
1. 雜湊表
正是萬惡的一本通給我們指引的一條道路
非常的暴力,往雜湊表裡不斷加數即可,每算出一項就查一次表。
時間複雜度約 θ
(2000000
)\theta(2000000)
θ(2000
000)
,看上去毫無問題
於是這裡有乙份**:
#include
#include
#include
using
namespace std;
const
int p=
100003
;int a,b,c,x=
1,s,last[p]
;struct node
; vectorf;
//這裡用vector是想優化一下空間,事實上陣列即可
intfind()
intmain()
); last[1]
=0;for
(int i=
1; i<=
2000000
;++i)
); last[s]
=f.size()
-1;}
puts
("-1");
return0;
}
在 loj
\rm loj
loj 上是可以過的。你把模數調到1145141
還會跑得更快。
不過時間不是重點,這份**被光榮地卡空間了。。
30只要資料稍微強一些,就會導致我們存的數大大增多,然後就算%30\%
30% 的資料 空間限制 4
m\rm 4m
4m。( 囿於
測評系統
的實現,
這部分的
空間限制
取消(小
聲\tiny(囿於測評系統的實現,這部分的空間限制取消(小聲
(囿於測評系
統的實現
,這部分
的空間限
制取消(
小聲
vector
也挽救不了了
這種做法是無法完美通過這道題的。我們需要再研究一下別的做法。
2.
雙雜湊\large \textbf
2. 雙雜湊
去 l oj
\rm loj
loj 翻了一下提交記錄,然後發現有人用這種做法在 4mb
\rm 4mb
4mb 的空間限制內通過了此題。
提交記錄
單雜湊做法很好想,但是衝突概率極大以至於無法通過此題,所以考慮使用雙雜湊。
雙雜湊一般是不會被卡掉的,直接認為是正確的就好了
不過這種做法空間是線性的,仍然需要占用 2mb
+\rm 2mb+
2mb+
的空間,事實上我們有更優的解法。
3.
數學做法
\large \textbf
3. 數學做法
觀察數列的遞推式可以看出,這個數列是存在迴圈節的。
也就是說,整個數列大概是下面這種情況:
根據題目要求,迴圈節長度不能超過 2×1
062\times10^6
2×10
6 ,所以 a2×
106a_
a2×106
一定在這個迴圈裡面。
於是我們找到第乙個和 a2×
106a_
a2×106
相等的元素,它們之間的距離就是迴圈節的長度 len
\rm len
len 。如果沒有找到則說明迴圈節長度大於 2×1
062\times10^6
2×10
6 ,此時輸出 −1-1
−1。於是我們可以分別從 a
0a_0
a0 和 ale
na_alen
開始同時往後計算,找到的第一對相等元素即是答案。
**:
#include
const
int inf=
2e6;
int a,b,c,s1=
1,s2=
1,len;
intmain()
//迴圈結束後,len更新至最小值,即是迴圈節長度if(
!len)
return
puts
("-1"),
0;//沒有更新len,說明迴圈節長度大於inf
s1=s2=1;
for(
int i=
1; i<=len;
++i) s2=
(1ll
*s2*a+s2%b)
%c;//計算a[len]
for(
int i=
0; i<=inf;
++i)
puts
("-1");
//沒有找到解
return0;
}
一本通的遞迴練習
給定乙個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。我們假設對於小寫字母有 a b y z 而且給定的字串中的字母已經按照從小到大的順序排列。char a 10 b 10 將a字串的各種排列依次放到b字串中 int vis 10 n 用vis i 來代表a i 字母有沒有被訪問過 void...
一本通 3 2 練習 7 道路和航線
又水又坑的一題,spfa裸題,但要加deque優化,用堆都不行。題目描述 原題來自 usaco 2011 jan.gold farmer john 正在乙個新的銷售區域對他的牛奶銷售方案進行調查。他想把牛奶送到 ttt 個城鎮 編號為 111 到 ttt。這些城鎮之間通過 rrr 條道路 編號為 1...
一本通 1 2 練習 2 擴散
題目link 這道題雖說是二分裡的,但是我沒用二分的做法。首先我的想法是直接找到任意兩點之間的最大距離即可,但是後來寫完交上去發現不對,之後分析了一下發現兩個點成為同乙個連通塊是可以通過另外乙個連通塊更新距離的,因為另乙個連通塊也可以擴散,有點類似 floyd 更新完之後可以直接像第乙個思路一樣算了...