大富翁國因為通貨膨脹,以及假鈔氾濫,**決定推出一項新的政策:現有鈔票編號範圍為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...