HDOJ 1005 取餘,迴圈,找規律

2021-06-13 04:27:23 字數 926 閱讀 4977

第一印象就是斐波那契啊,迭代一下吧,不過tle了

然後就開始查思路,歸納如下:這個數列必然是重複某個部分的,理由如下,我覺得理由2好像好懂一點,不過數學太差,不知道有沒有數學根基

1、因為公式是f(n) = (a * f(n – 1) + b * f(n – 2)) mod 7,所以f(n)=(a%7*f(n-1)+b%7*f(n-2))%7,a%7與b%7的值的範圍只有0~6,也就是說迴圈體最大是49。那就可以用乙個大於49的陣列來儲存f(n),直到找出迴圈為止。

2、因為迴圈的條件就是有2個數m和n

f[m-1] = f[n-1], f[m] = f[n]

這樣就會開始迴圈了。

即f[n-1], f[n]與之前的[m-1],f[m]分別對應

而 0 <= f[n-1],f[n] < 7

所以f[n-1]f[n]連著的情況有7*7的情況。

只需每次求出乙個f[n],然後比較f[n-1]f[n]與前面數的情況即可。

所以在一定範圍內f[50]就會出現重複——迴圈節

那麼這麼找這個迴圈的週期,和迴圈的開始呢?

網上有些人是認為f[1],f[2]是迴圈的開始,然後找連續兩個1就當作迴圈的結尾,但是f[50]內可能是這樣的:

1 1 2 3 0 4 2 3 0 4...

所以還是按照思路來實現,找重複出現的兩個數:

找到了迴圈的週期(迴圈末位減迴圈的開始),迴圈的開始之後,就將n對映到f[50]內的結果裡,看**:

#include using namespace std;

int main()

; f[1]=f[2]=1;

bool ck =false;

for(int i=3;i<=51;i++)

{f[i] = (f[i-1]*a+f[i-2]*b)%7;

for(int j=2;j

HDOJ1005 連蒙帶猜的做法

暴力膜擬tle了 於是就猜到有個迴圈,反應過來可能可以用kmp演算法求連續的兩個相同的數字串,後來想想直接求解找乙個最小的迴圈週期更方便 然後直接在附上答案的陣列中取就好了 沒有用數學過程求解最小迴圈週期是多少,但是想想看開個 本部落格用來紀念oj小白的刷題記錄 附上ac include inclu...

取模與取餘

通常情況下取模運算 mod 和求餘 rem 運算被混為一談,因為在大多數的程式語言裡,都用 符號表示取模或者求餘運算。在這裡要提醒大家要十分注意當前環境下 運算子的具體意義,因為在有負數存在的情況下,兩者的結果是不一樣的。對於整型數a,b來說,取模運算或者求餘運算的方法都是 1.求 整數商 c a ...

取餘和取模

對於整型數a,b來說,取模運算或者求餘運算的方法都是 1.求 整數商 c a b 2.計算模或者餘數 r a c b.但是求模運算和求餘運算在第一步不同 求餘運算在取c的值時,向0 方向捨入 int強制轉換 而取模運算在計算c的值時,向負無窮大方向捨入 floor 函式 因此,當a和b符號一致時,求...