幾個定理: a/b=a*b的逆元
b^(c-1)%c=1
∴ b*b^(c-2)%c=1
∴ 1/b=b^(c-2)%c
∴ a/b%9973=a*b^9971%9973;
乘法逆元的作用: 因為(a%c)/(b%c)!=(a/b)%c;
所以為了運算準確,有公式 (a/b)%c=a*b^(c-2)%c。
為了求b^(c-2),需要用到快速冪。
只有在除法運算中,(a%c)/(b%c)!=(a/b)%c,但是在乘法、加法、減法運算中,例如(a*b)%c==(a%c)*(b%c)%c 簡而言之,轉化乘法逆元也是這樣,將除法轉化為乘法,就可以多次取模來進行很大位數的運算。
題目:度熊手上有一本字典儲存了大量的單詞,有一次,他把所有單詞組成了乙個很長很長的字串。現在麻煩來了,他忘記了原來的字串都是什麼,神奇的是他竟然記得原來那些字串的雜湊值。乙個字串的雜湊值,由以下公式計算得到: h(
s)=∏
i=1i
≤len
(s)(
si−28
) (m
od9973
)'>h(s)=∏i≤len(s)i=1(si−28)(mod9973)si
'>h(
s)=∏
i=1i
≤len
(s)(
si−28
) (m
od9973
)'>s
i'>si
代表 s[i] 字元的 ascii 碼。
請幫助度熊計算大字串中任意一段的雜湊值是多少。
input
多組測試資料,每組測試資料第一行是乙個正整數n
'>n
,代表詢問的次數,第二行乙個字串,代表題目中的大字串,接下來n
'>n
行,每行包含兩個正整數a
'>
a和b'>
b,代表詢問的起始位置以及終止位置。 1≤
n≤1,
000'>1≤n≤1,0001≤
len(
stri
ng)≤
100,
000'>1≤len(string)≤100,0001≤
a,b≤
len(
stri
ng)'>1≤a,b≤len(string)
output
對於每乙個詢問,輸出乙個整數值,代表大字串從 a
'>a
位到 b
'>b
位的子串的雜湊值。
sample input
2sample outputacmlove2015
1 11
8 10
1testmessage
1 1
68919240
88
1 #include2 #include3 #include4 typedef longlong
ll;5
const
int maxn=1e5+10;6
#define mod 9973
7ll powmod(ll a,ll b)817
return ans%mod;
18}
19char
s[maxn];
20int
n,a,b;
21int
num[maxn];
22int
main()
2333
while(n--)
343839}
40return0;
41 }
乘法逆元及逆元求法
模運算 取餘運算,即a除以b得到的餘數,記為mod,又記為 模運算過程中,加減乘都可以先對a,b進行 p,然後再進行加減乘,最後再 p,結果不變 運算子優先順序,模運算和乘除法的運算子優先順序是一樣的 同餘 a和b除以p得到的餘數相同,即p可以整除 a b 求解 cfrac mod p 的值,因為除...
模板 乘法逆元
適用 求某乙個數在模意義下的乘法逆元。如果a p互質,那麼有ap a就是p的倍數,所以有ap a modp ap 1 1 modp 所以只要打乙個快速冪就ok了。code include using namespace std int n,p int power int x,int k return...
模板 乘法逆元
這是一道模板題 給定n,p求1 n中所有整數在模p意義下的乘法逆元。輸入格式 一行n,p 輸出格式 n行,第i行表示i在模p意義下的逆元。輸入樣例 1 複製10 13 輸出樣例 1 複製179 108112 534 1 n 3 106,n1 n 3 106,n輸入保證 p p p 為質數。先扔個線性...