G List it all
傳送
題意:
題解:
我們來(lái)考慮以下樣例:1,1,2
我們先考慮1的貢獻(xiàn):如圖(圖中只花了)
2!表示還剩兩個(gè)空位,還有兩個(gè)數(shù)未填入,所以是2!個(gè)
對(duì)于n個(gè)數(shù)重復(fù),考慮重復(fù)的情況就是:111…11(一共n個(gè))* (n-1)! * sum
sum為Σa[i] * i,即每個(gè)數(shù)出現(xiàn)的次數(shù) *這個(gè)數(shù)的總和
然后考慮去重:
1,1,2所組成的重復(fù)情況有:
112,112
其中我用()括號(hào)來(lái)將1分號(hào)
1(1)1(2)2,1(2)1(1)2
也就是雖然這兩個(gè)的1是不同貢獻(xiàn)的,但是最終組成結(jié)果一樣,所以要去掉,怎么去?在這個(gè)例子中除以2,因?yàn)橛袃蓚€(gè)1重復(fù)了。那我們現(xiàn)在用1,1,1,2組成重復(fù)情況有:1112,1112,1112,1112,1112,1112,會(huì)發(fā)現(xiàn)有6個(gè)重復(fù)情況,因?yàn)槿齻€(gè)1全排列有6種情況,所以我們除以6,也就是重復(fù)x次,就除以x!,注意除了1重復(fù),2也有可能,所以每個(gè)數(shù)都要去除重復(fù),我們?cè)O(shè)a[i]表示第i個(gè)數(shù)出現(xiàn)的次數(shù)所以就要除以(a[1]!*a[2]!..a[9]!)
總結(jié)答案就是:
ans=(11…111(一共n個(gè)1)) * (n-1) * sum/(a[1]!*a[2]!..a[9]!)
答案要取模
代碼:
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> using namespace std; const int N = 1e6 + 5; const int mod = 1e9 + 7; int fac[N], ifac[N]; int T[20]; typedef long long LL;int pow(int a, int b) {LL res = 1;for(;b;b >>= 1, a = (LL) a * a % mod) if (b & 1) res = res * a % mod;return res; }int main() {int Max = 1000000;fac[0] = 1;for(int i = 1; i <= Max; ++ i) fac[i] = (LL)fac[i - 1] * i % mod;ifac[Max] = pow(fac[Max], mod - 2);for(int i = Max-1; i >= 0; -- i) ifac[i] = (LL)ifac[i + 1] * (i + 1) % mod;LL Sum = 0;int Count = 0;for(int i = 1; i <= 9; ++ i) {int temp;cin >> temp;T[i] = temp;Sum += i * temp;Count += T[i];} Sum %= mod;LL part_I = 0;for(int i = 1; i <= Count; ++ i) part_I = (part_I * 10 + 1) % mod;LL part_mul = fac[Count - 1];LL part_div = 1;for(int i = 1; i<= 9; ++ i) part_div = part_div * ifac[T[i]] % mod;cout << (LL)Sum * part_I %mod * part_mul %mod * part_div % mod << endl; }總結(jié)
以上是生活随笔為你收集整理的G List it all的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Super Jumping! Jumpi
- 下一篇: HDU 5510 Bazinga