暴力就是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
−1k
n×va
li
每個組合技出現的概率為1k2那麼我們o(kk21
,有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
)的算一下就好啦,關於取模除法我們用費馬小定理逆元就可以了,因為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...