莎拉公主的困惑(bzoj 2186)

2022-05-14 06:47:08 字數 1156 閱讀 7080

大富翁國因為通貨膨脹,以及假鈔氾濫,**決定推出一項新的政策:現有鈔票編號範圍為1到n的階乘,但是,**只發行編號與m!互質的鈔票。房地產第一大戶沙拉公主決定**一下大富翁國現在所有真鈔票的數量。現在,請你幫助沙拉公主解決這個問題,由於可能張數非常大,你只需計算出對r取模後的答案即可。r是乙個質數。

第一行為兩個整數t,r。r<=10^9+10,t<=10000,表示該組中測試資料數目,r為模後面t行,每行一對整數n,m,見題目描述 m<=n

共t行,對於每一對n,m,輸出1至n!中與m!素質的數的數量對r取模後的值

1 11

4 21

資料範圍:

對於100%的資料,1 < = n , m < = 10000000

/*

因為m<=n,所以m!|n!,我們很容易知道如下結論

對於兩個正整數m和n,如果n是m的倍數,那麼1->n中與m互素的數的個數為(n/m)φ(m)

本結論是很好證明的,因為1->m中與m互素的個數為φ(m),又知道(i,m)=(i+km,m),所以

結論成立。那麼對於本題,答案就是

(n!/m!)φ(m!)=(n!/m!)m!(1-1/p1)(1-1/p2)...(i-1/pk)

=n!(1-1/p1)(1-1/p2)...(i-1/pk)

其中pi為小於等於m的所有素數,先篩選出來即可。由於最終答案對乙個質數取模,所以要用逆元,這裡

求逆元就有技巧了,用剛剛介紹的遞推法預處理,否則會tle的。

*/#include

#include

#include

#define n 10000010

#define lon long long

using

namespace

std;

lon ans1[n],ans2[n],inv[n];

bitset

prime;

void

get_prime()

}}int

main()

ans2[

1]=1

;

for(int i=2;i)

else ans2[i]=ans2[i-1

]; }

while(t--)

return0;

}

BZOJ2186 沙拉公主的困惑(數論)

bzoj 考慮答案是啥 先假設n m 現在求的就是 m 但是現在n 是m 的若干倍 我們知道 gc d x,y g cd x ky,y 所以,相當於 每隔m 答案增長的值都是 m 所以 我們可以得出 an s n m m 後面的 可以直接拆開,列舉質因數 an s n m m pi pi 1 ans...

線性篩選素數和線性篩選尤拉函式 bzoj2190

一 線性篩選素數 include includeusing namespace std int prime 1110000 pr,n bool v 1110000 void getprime for int j 1 j pr i prime j n j int main 線性篩選尤拉函式 求小於n,...

尤拉函式 Bzoj P2186 沙拉公主的困惑

大富翁國因為通貨膨脹,以及假鈔氾濫,決定推出一項新的政策 現有鈔票編號範圍為1到n的階乘,但是,只發行編號與m 互質的鈔票。房地產第一大戶沙拉公主決定 一下大富翁國現在所有真鈔票的數量。現在,請你幫助沙拉公主解決這個問題,由於可能張數非常大,你只需計算出對r取模後的答案即可。r是乙個質數。1 inc...