今天原本是學習離散對數第三類問題,也是最複雜的一類,不過容量太大,幾乎是之前所有知識的綜合了,所以先發乙個重要步驟:解原根。
當考慮問題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表示最大的值,比陣列中每乙個元素都大,而且個數足夠多。編寫乙個程式,在這個陣列中找出某個給定的值。思路 二分查詢法是乙個非常高效的演算法,但要想使用二分查詢法,必須滿...