HDU 5646 DZY Loves Partition
題目鏈接:
hdu:http://acm.hdu.edu.cn/showproblem.php?pid=5646
bc:http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=680&pid=1002
DZY Loves Connecting
?Accepts: 16 ? ??Submissions: 169
?Time Limit: 4000/2000 MS (Java/Others)
?Memory Limit: 262144/262144 K (Java/Others)
問題描述
DZY有一棵nn個結點的無根樹,結點按照1\sim n1~n標號。
?
DZY喜歡樹上的連通集。一個連通集SS是由一些結點組成的集合,滿足SS中任意兩個結點u,vu,v能夠用樹上的路徑連通,且路徑上不經過SS之外的結點。顯然,單獨一個結點的集合也是連通集。
?
一個連通集的大小定義為它包含的結點個數,DZY想知道所有連通集的大小之和是多少。你能幫他數一數嗎?
?
答案可能很大,請對10^9 + 710?9??+7取模后輸出。
輸入描述
第一行tt,表示有tt組數據。
接下來tt組數據。每組數據第11行一個數nn。第2\sim n2~n行中,第ii行包含一個數p_ip?i??,表示ii與p_ip?i??有邊相連。(1\le p_i \le i-1,2\le i\le n1≤p?i??≤i?1,2≤i≤n)
?
(n\ge 1n≥1,所有數據中的nn之和不超過200000200000)
輸出描述
每組數據輸出一行答案,對10^9 + 710?9??+7取模。
輸入樣例
2
1
5
1
2
2
3
輸出樣例
1
42
Hint
?
第二個樣例中,樹的4條邊分別為(1,2),(2,3),(2,4),(3,5)。所有連通集分別是{1},{2},{3},{4},{5},{1,2},{2,3},{2,4},{3,5},{1,2,3},{1,2,4},{2,3,4},{2,3,5},{1,2,3,4},{1,2,3,5},{2,3,4,5},{1,2,3,4,5}。
If you need a larger stack size,
please use #pragma comment(linker, "/STACK:102400000,102400000") and submit your solution using C++.
題解:
注:sum(a,k)表示以a為首項,項數為k的等差數列和(差值為1)
首先判斷可行性:
如果sum(1,k)>n,那么明顯無法將n劃分成k個不同的數。
其次探究最優解的性質:
由于當1<=a<=b-2的時候有ab<(a+1)(b-1),所以當k個數連續或只有一個長度為1的空隙的時候得到最優解。
求解最優值:
設由a開始的k個數為解,則有(a+a+k-1)*k/2==n,所以a>=(int)( ( (n*2.0/k)+1-k)/2),經過調整可求得a',使得sum(a'-1,k) <=n<sum(a',k)。這樣只要將數列sum(a',k)的前(sum(a',k)-n)項向左移一位即可求得最優解對應的數列。由sum(1,k)<=n得k<=sqrt(n),可對這個數列暴力求積。
代碼:
1 #include<iostream> 2 #include<cstdio> 3 #define SUM(a,k) ((a * 2 + k - 1)*k / 2) 4 using namespace std; 5 6 typedef long long LL; 7 const int mod = 1e9 + 7; 8 9 LL n, k; 10 11 int main() { 12 int tc; 13 scanf("%d", &tc); 14 while (tc--) { 15 scanf("%lld%lld", &n, &k); 16 if (n < (1 + k)*k / 2) { 17 printf("-1\n"); 18 continue; 19 } 20 LL a = (LL)((n * 2 * 1.0 / k + 1 - k) / 2); 21 while (SUM(a, k) <= n) a++; 22 LL adj = SUM(a, k) - n; 23 LL ans = 1; 24 for (int i = 0; i < k; i++) { 25 if (i < adj) { 26 ans *= (a + i - 1); 27 } 28 else { 29 ans *= (a + i); 30 } 31 ans %= mod; 32 } 33 printf("%lld\n", ans); 34 } 35 return 0; 36 } View Code轉載于:https://www.cnblogs.com/fenice/p/5324663.html
總結
以上是生活随笔為你收集整理的HDU 5646 DZY Loves Partition的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件过程与项目管理第四周作业
- 下一篇: VMwareworkstation 12