?
我們根據歐幾里得定理可以知道
(a,b)=(b,a mod b)也可以得到
(a+b,b)=(b,(a+b) mod b)=(b,a)=(a,b)
直觀點說就是兩個數a,b的gcd,和a+b,b的gcd是相等的
那么我們可以知道phi(m!)也就是與1-m!中與m!互質的數,
那么對于每個互質的數,我們加上m!,就可以得到一個新的
和m!互質的數,所以對于每個1-m!與m!互質的數
n!范圍內一共可以得到n!/m!組解,那么一共也就是phi(m!)*(n!/m!)
可以將phi(m!)用公式展開化簡,在此不再贅述
/************************************************************** Problem: 2186 User: BLADEVIL Language: Pascal Result: Accepted Time: 9524 ms Memory: 248272 kb ****************************************************************/ // By BLADEVIL var t, r :longint; i :longint; prime : array [ 0 .. 1000001 ] of longint; flag : array [ 0 .. 10000001 ] of boolean; fac, pi1, pi2 : array [ 0 .. 10000001 ] of int64; x, y :int64; procedure make; var i, j :longint; begin fac[ 0 ]:= 1 ; flag[ 1 ]:= true; for i:= 1 to 10000000 do fac[i]:=fac[i- 1 ]*int64(i) mod r; for i:= 2 to 10000000 do begin if not flag[i] then begin inc(prime[ 0 ]); prime[prime[ 0 ]]:= i; end ; for j:= 1 to prime[ 0 ] do begin if i*prime[j]> 10000000 then break; flag[i *prime[j]]:= true; if i mod prime[j]= 0 then break; end ; end ; pi1[ 0 ]:= 1 ; pi2[ 0 ]:= 1 ; for i:= 1 to 10000000 do begin pi1[i]: =pi1[i- 1 ]; if not flag[i] then pi1[i]:=pi1[i]*int64(i- 1 ) mod r; end ; for i:= 1 to 10000000 do begin pi2[i]: =pi2[i- 1 ]; if not flag[i] then pi2[i]:=pi2[i]*int64(i) mod r; end ; end ; procedure ex_gcd(a,b:int64); var z :int64; begin if b= 0 then begin x: = 1 ; y:= 0 ; exit; end ; ex_gcd(b,a mod b); z: = x; x: = y; y: =z-(a div b)* y; end ; function gcd(a:int64):int64; begin ex_gcd(a,r); gcd: =(x mod r+r) mod r; end ; procedure main; var i :longint; ans :int64; n, m :longint; begin read(n,m); ans: = fac[n]; ans: =ans*pi1[m] mod r; ans: =ans*gcd(pi2[m]) mod r; writeln(ans); end ; begin read(t,r); make; for i:= 1 to t do main; end .
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
