2月28日 解原根(素數)

2021-08-15 22:15:09 字數 1157 閱讀 1234

今天原本是學習離散對數第三類問題,也是最複雜的一類,不過容量太大,幾乎是之前所有知識的綜合了,所以先發乙個重要步驟:解原根。

當考慮問題xa

≡b(m

odp)

x a≡

b(mo

dp

)時,兩邊取離散對數,底數需要取a的原根。原根有很多定義,這裡不詳講。求原根主要還是搜尋,不過由beizer定理有乙個優化:

如果不存在pi

p

i使得mϕ

(p)p

i≡1(

modp

) mϕ(

p)pi

≡1(m

odp)

,其中pi

p

i是ϕ(

p)ϕ (p

)即尤拉函式的質因子,那麼m是p的乙個原根。一般我們求最小原根。

簡單寫了一段**,但只適用素數,合數的過幾天再寫。

#include

#include

#include

typedef

long

long ll;

#define maxn 1000000

ll solu[maxn];

ll solunum;

ll notpri[maxn], pri[maxn];

ll cnt = 0;

ll fast_pow(ll a, ll b, ll p)

return tmp;

}ll inv(ll a, ll p)

//素數初始化

void ini()

}}ll proottable[maxn];

ll factor[maxn];//注意memset

ll factornum;

ll proot(ll n)

if (***)factor[factornum++] = pri[i];

if (ncopy == 1)break;

//if (ncopy / pri[i] < pri[i])

// }

for (ll i = 2; i < n; i++)

}if (*** == 1)return i;

}}int main()

2023年2月28日訓練日記

繼續過題 置換群篇 old sorting 問乙個置換變為公升序最少用幾次,用到了置換群的乙個結論,就是讓乙個含有cnt個元素的迴圈節要想變成公升序最少需要cnt 1次,然後dfs搜迴圈節就行了。費馬小定理篇 一直都只是知道這個定理,也曾經用過,一看部落格才發現並不是個不常用的定理,處處有優化啊 s...

無限式查詢 2023年2月28日

問題描述 已知乙個陣列x,元素個數有多少並不很清楚,但是陣列元素已經依順序從小到大排好,而且在陣列最後新增了足夠多的max記號 max表示最大的值,比陣列中每乙個元素都大,而且個數足夠多。編寫乙個程式,在這個陣列中找出某個給定的值。思路 二分查詢法是乙個非常高效的演算法,但要想使用二分查詢法,必須滿...

無限式查詢 2023年2月28日

問題描述 已知乙個陣列x,元素個數有多少並不很清楚,但是陣列元素已經依順序從小到大排好,而且在陣列最後新增了足夠多的max記號 max表示最大的值,比陣列中每乙個元素都大,而且個數足夠多。編寫乙個程式,在這個陣列中找出某個給定的值。思路 二分查詢法是乙個非常高效的演算法,但要想使用二分查詢法,必須滿...