标签:style blog http io color for sp 数据 div
http://acm.hdu.edu.cn/showproblem.php?pid=5086
题目大意:
给定一个序列,求这个序列的子序列的和,再求所有子序列总和,这些子序列是连续的。去题目给的第二组数据的
3
1 2 3
这个序列的子序列有 [1]、[2]、[3]、[1、2]、[2、3]、[1、2、3],这些子序列的和是分别是1、2、3、3、5、6。再将这些和加起来
1+2+3+3+5+6=20这个就是最终的答案。
解题思路:
我们假设n等于5。序列为1、2、3、4、5。然后我们将它们如下排列,每行表示一个序列
1 2 1 2 3 2 3 1 2 3 4 3 4 2 3 4 1 2 3 4 5 4 5 3 4 5 2 3 4 5 1 2 3 4 5
我们从中会发现序列中的a[i](表示序列第i个数),不管在那堆里面,a[i]有i个。总共有几个a[i]*i呢,可以看出有n-i+1个。
所以推出公式为∑a[i]*i*(n-i+1)就是正确的答案了
为什么我们要推公式,是因为我们暴力做的话时间复杂度是O(n^2),根据题目给的数据,肯定会超时。
推出的公式的时间复杂度是O(n),题目给的数据,是不会超时的。
AC代码:
1 include<stdio.h> 2 3 #define MOD 1000000007 4 5 typedef __int64 LL; 6 7 int main(){ 8 int t; 9 LL sum, num, n; 10 scanf("%d", &t); 11 while(t--){ 12 scanf("%I64d", &n); 13 sum = 0; 14 for(LL i = 1; i <= n; ++i){ 15 scanf("%I64d", &num); 16 sum = (sum + num * i % MOD * (n - i + 1) % MOD) % MOD; 17 } 18 printf("%I64d\n", sum); 19 } 20 return 0; 21 }
HUD 5086 Revenge of Segment Tree(递推)
标签:style blog http io color for sp 数据 div
原文地址:http://www.cnblogs.com/xuqiulin/p/4068311.html