【題目描述】
給出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...