LOJ6267 生成隨機數

2022-03-25 20:03:25 字數 1006 閱讀 5418

link

先考慮\(m=2^k\)的情況。

首先我們可以設計一種可行的策略:連續拋\(k\)次硬幣得到\(2^k\)種結果,而每個數\(i\)對應其中\(a_i\)種。

不難發現每個數對應的一些結果是可以合併的,即扔不到\(k\)就能確定是哪個數。

可以證明最優的合併方案的結果就是\(\fracm\)在\(2\)進製下的各個\(1\)位。

對於每個\(a_i\),設\(\fracm=\sum\limits_\frac1\),那麼結果就是\(\sum\limits_^n\sum\limits_\frac x\)。

然後考慮\(m\ne2^k\)的情況。

簡單推理可以發現,此時有一些結果不會對應任何乙個數,也就是說\(s(x)\)可能變成了乙個無限集,但是\(m=2^k\)時的結論依舊適用。

記\(f(\frac xm)=\sum\limits_\frac i\),那麼答案就是\(\sum\limits_^nf(\fracm)\)。

但是直接求\(f\)看上去不太現實,我們發現\(f(2x-\lfloor2x\rfloor)=2f(x)-2x\),不難發現它會成環。

成環之後我們就可以推出環中某個\(f(x)\)繼而推出環中所有\(f(x)\)了。

#include#includeconst int n=10000007,p=998244353;

int m,inv,cnt,a[n],pw[n],vis[n],is[n],f[n];std::stackstk;

int read()

int inc(int a,int b)

int mul(int a,int b)

int pow(int a,int k)

int next(int x)

void solve(int x)

int main()

for(int i=1;i<=n;++i) ans=inc(ans,f[a[i]]);

printf("%d",ans);

}

c 11 生成隨機數

過程中需要輸入自變數得到輸出結果。一般來說,如果在定義域中通過列舉的方式選取自變數,所需 要的時間會很長。如果選取特定的點作為自變數,程式或數學模型的正確性無法得到保證。如果隨機選取一定數量 的自變數,所需時間可以依選取的自變數數目而定,的結果能夠反映一般情況下的結果。c 11提供均勻分布 伯努利分...

題28 生成隨機數 輸出10個隨機數

define crt secure no warnings include include rand 隨機數函式的標頭檔案 include srand 和time 要用到的標頭檔案 intmain time null 能獲取時間戳 unsigned int 是把時間戳資料強制轉換成無符號整型 輸出1...

Python學習筆記(2) 生成隨機數

python中的random模組提供了一些很有用的方法來幫我們生成隨機數。接下來我們來看一下random模組中都包括哪些方法。randint方法接收兩個整型引數a和b,其中第乙個引數必須小於第二個引數 可以等於,但是沒有意義 然後返回乙個大於等於a且小於等於b的隨機整數。下面可以生成0到5的隨機整數...