隨 rand 巧用快速冪)(期望dp

2021-08-30 15:29:09 字數 2217 閱讀 4501

【題目描述】

給出n個正整數a1,a2…an和乙個質數mod.乙個變數x初始為1.進行m次操作.每次在n個數中隨機選乙個ai,然後x=x*ai%mod.問m次操作之後x的取值的期望.

答案一定可以表示成a/b的精確分數形式.a和b可能很大,所以只需要輸出a*(b^(10^9+5))模10^9+7的結果.

【輸入格式】

第一行三個整數n,m,mod.

接下來一行n個空格隔開的正整數a1,a2…an

【輸出格式】

一行乙個整數表示答案

【樣例輸入】

21 3 1 2

【樣例輸出】

3【資料範圍】

第1個測試點:mod=2

第2個測試點:n=1

第3,4,5個測試點:m<=1000,1<=mod<=300.

第6,7,8個測試點:1<=mod<=300

對於全部測試點: 1<=ai法一。mod = 1e9 +7;

f[i][j]:i個數a(a1,a2....am)相乘模mod得j的方案數=、=。

因為f[i+1][j*k%mod] += (f[i][j] * k的個數)%mod。m那麼大。。。陣列開不下,乙個乙個列舉也超時!

同理可得f[2*i][j*k%mod] += (f[i][j] * f[i][k])%mod。

考慮把m二進位制拆分。也就是f[2*i][j*k%mod] = (f[i][j] * f[i][k])%mod。//陣列開不下?滾起來!!!也可以只要一維,因為2*i,只會由i影響,拿乙個輔助陣列,把所有i得到的2i,先存在fz中,再賦回去。

如果m的二進位制的第i位為1的話,那麼所有的f[i][j]肯定是取的m個數的一部分。f[i][j]和快速冪的更新方法一樣=、=

f[2*i][j*k%mod] += (f[i][j] * f[i][k])%mod。

int mpow(int a,int b)

return rt;

}

上面是求a^b的板子,我們現在要求b個不同的a相乘。

現在m相當於b, f陣列就相當於a。//這裡的f[j]表示選了2^i個不同的a相乘%mod得j的方案數。

g相當於rt。//這裡的g[j]表示選了2^i+(2^k) + 2^z...個不同的a(m的二進位制的第i位,並且第i位為1,2^i個數是m個數的一部分,k,z同理)相乘%mod得j的方案數.

其實g[i+k+z)][j*jj%mod] += (f[i][j] * g[k+z][jj])%mod(選了2^i個不同的a相乘%mod得j的方案數 * 選了2^(k+z)個不同的a相乘%mod得jj的方案數  ==選了2^(i+k+z)個不同的a相乘%mod得(j * jj%mod)的方案數 )

i是一位一位的把m給二進位制拆分分的的。

最後的g[j]就是m個不同的數相乘%mod得j的方案數;

期望等於每個最後方案數*每個最後取值的和/總方案數。//我盡力了。。請各位感性理解一波=。=、

#includeusing namespace std;

const int modd = 1e9 + 7;

int n,m,mod,g[1005],fz[1005],f[1005];

void read(int &x)

while(c >= '0' && c <= '9')

if(f) x = -x ;

}int mpow(int a,int b)

return rt;

}void hehe()

int main()

g[1] = 1; int ha = m;

for( ; ha;ha >>= 1,hehe()) }

int ans = 0;

for(int i = 1; i < mod; i++) ans = (ans + 1ll * i * g[i]) % modd;

printf("%d", 1ll * ans * mpow(mpow(n,m),modd-2) % modd);

return 0;

}

法二:原根rt的1次方,2次方…(p-1)次方在模p意義下可以取遍1到(p-1)的所有整數。所以不論是多少個a1,a2,a3,a5....an相乘。

都可以用rt表示。

f[i][j] :2^i個數相乘最後模mod得rt^j次方的方案數。當冪的次數(j)大於mod-1(p - 1)時,就從頭來.

f[i][(j+k)%(mod-1)]  += f[i-1][k] *f[i-1][j];

dp 矩陣乘法快速冪

1 p1926 斐波那契 include include include using namespace std long long n const int mod 1000000007 long long nw 2 2 ans 2 2 long long t 2 2 void mul1 void ...

DP 矩陣快速冪 kmp GT考試

阿申準備報名參加 gt 考試,准考證號為 n 位數 x1x 2 xn x 1x 2 x n x1 x2 xn 他不希望准考證號上出現不吉利的數字。他的不吉利數字 a1a 2 am a 1a 2 a m a1 a2 am 有 m 位,不出現是指 x1x2 xn 中沒有恰好一段等於 a1a 2 am a...

514E 矩陣快速冪 DP

一棵樹,每個結點有n個兒子,該第i個兒子到父節點的距離為d i 問離根節點距離不超過x的結點有多少個,結果對1e9 7取模。首先注意到每個di 100資料很小,如果用ti表示所有n中分支中長度為i的個數,那麼就有t 1 100 用dp i 表示到根節點長度為i的點的個數,那麼不難發現狀態轉移方程 d...