洛谷比賽 P5011 水 造題 題解

2022-05-16 10:20:47 字數 3234 閱讀 9880

暴力就是o(k

n)o(

kn)吧,不過n

n非常之大,有101

0610

106(高精可怕.jpg)

但是我們發現,對於求期望,那麼就是概率×

×權值,所以我們可以先求出每種動作的貢獻:

每種動作出現在某個位置的概率為1kk

1​,貢獻為它的val

val,總共有n

n個可以出現的位置,所以貢獻為∑i=

0k−1

n×va

lik∑

i=0k

−1​k

n×va

li​​

接下來就是組合技的多的貢獻,每個組合技還會再貢獻一次,所以我們這樣來看:

每個組合技出現的概率為1k2

k21​

,有n−1n

−1個可以出現的位置,每一種的貢獻為val

i+va

l(i+

1)%k

vali

​+va

l(i+

1)%k

​,所以總貢獻為∑i=

0k−1

(n−1

)×(v

ali+

val(

i+1)

%k)k

2∑i=

0k−1

​k2(

n−1)

×(va

li​+

val(

i+1)

%k​)

那麼我們o(k

)o(k

)的算一下就好啦,關於取模除法我們用費馬小定理逆元就可以了,因為1949100119

4910

01是個非常神奇且有巨大意義的質數,讀入n

n時直接取模就好啦。

**:

#include

#include

#include

#define ll long long

using

namespace std;

const

int m=

1e6+10;

const ll mod=

19491001

;char s[m]

;ll k,a[m]

,n,w;

ll inv_k,inv_k2;

void

readin()

w=(n-

1+mod)

%mod;

}ll sqr

(ll a)

ll fpow

(ll a,ll b)

ll ans,sum1,sum2;

intmain()

sum2=

(sum2+

(a[0

]+a[k-1]

)%mod)

%mod;

inv_k=

fpow

(k,mod-2)

; inv_k2=

(sqr

(inv_k)

%mod*w)

%mod;inv_k=

(inv_k*n)

%mod;

ans=

(sum1*inv_k%mod+sum2*inv_k2%mod)

%mod;

printf

("%lld\n"

,ans)

;return0;

}

下面還有一種解法,由hdx

rieh

dxri

e|orz|提供:

我們先不考慮開頭結尾,那麼每個數都有前後:

我們考慮,對於乙個位置的動作,它前後都不是組合技,那麼只會貢獻一次,那麼前面不是和它組合的概率為k−1

kkk−

1​,後面不是和它組合的概率為k−1

kkk−

1​,然後當前選這個的概率為1kk

1​,有n−2n

−2個位置可以這樣選,那麼貢獻為(k−

1k)2

×1k×

vali

×(n−

2)(k

k−1​

)2×k

1​×v

ali​

×(n−

2)對於可以形成組合技的(這裡只考慮組成乙個),那麼就是後面和它組合,前面不組合;或者前面組合,後面不組合。那麼貢獻就為(k−

1k×(

1k)2

×val

i×2×

(n−2

))×2

(kk−

1​×(

k1​)

2×va

li​×

2×(n

−2))

×2(這時val

ival

i​要算兩次貢獻,同樣還是有n−2

n−2個可以的位置)

對於前後都可以組合的,概率為(1k

)3(k

1​)3

,所以貢獻為(1k

)3×v

ali×

3×(n

−2)(

k1​)

3×va

li​×

3×(n

−2)(這裡要算前後三次)

然後對於開始和結尾兩個單獨的,我們考慮組不組合,那麼組合貢獻為1k×

1k×v

ali×

2k1​

×k1​

×val

i​×2

,不組合的為1k×

k−1k

×val

i×2k

1​×k

k−1​

×val

i​×2

,前後一樣所以×2×

2。下面上**

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int n=

1000010

;const ll mod=

19491001

;char num[n]

;int len;

ll n,m,inv1,inv2,inv3,val,ans,sum;

ll power

(ll a,ll p)

intmain()

洛谷P1307 數字反轉 水題

給定乙個整數,請將該數各個位上數字反轉得到乙個新數。新數也應滿足整數的常見形式,即除非給定的原數為零,否則反轉後得到的新數的最高位數字不應為零 參見樣例2 輸入格式 乙個整數 nn 輸出格式 乙個整數,表示反轉後的新數。輸入樣例 1 複製 123輸出樣例 1 複製 321輸入樣例 2 複製 380輸...

(水題)洛谷 P1036 選數

n 才20的資料量,我當時居然還在想怎麼分組組合,直接 2 暴力搞就行了。x i 太大了,不能事先處理出所有素數。誤!多數了乙個0!但是一共和的結果最多和選法的次數一樣,2 也就是 10 好像也很多 驗證是素數要 10 原來看錯了!那就用埃篩然後暴力判斷就好了。暴力都寫了半天,關鍵在於要在dfs進入...

(水題)洛谷 P1003 鋪地毯

一開始覺得是用樹套樹來區間修改單點查詢,但是發現空間不夠開。看了題解發現這個是靜態的問題,而且只問乙個點的結果。直接暴力判斷哪個地毯最後覆蓋這個點就行了。真的智障。includeusing namespace std define ll long long int a 10005 int b 100...