區間和的和
題目描述
輸入一個長度爲n的數組a,a包括(n+1)n/2個區間。每個區間所有數的和,被稱爲區間和,求所有(n+1)n/2個區間和的和。由於數值較大,輸出 mod 1e9+7 的結果。
對於30%的數據,1<=n<=100 ;
對於50%的數據, 1<=n<=1000;
對於100%的數據,1<=n<=100000。
解:
看到這一題呢,感覺應該可以先推一下,可能會有一點點的規律。然後我就手推了一下
數:1 2 3
區間:
1
2
3
1 2
2 3
1 2 3
數 | 出現次數 |
---|---|
1 | 3 |
2 | 4 |
3 | 3 |
數:1 2 3 4
區間:
{1}
{2}
{3}
{4}
{1 2}
{2 3}
{3 4}
{1 2 3}
{2 3 4}
{1 2 3 4}
數 | 出現次數 |
---|---|
1 | 3 |
2 | 6 |
3 | 6 |
4 | 4 |
數:1 2 3 4 5
區間:
{1}
{2}
{3}
{4}
{5}
{1 2}
{2 3}
{3 4}
{4 5}
{1 2 3}
{2 3 4}
{3 4 5}
{1 2 3 4}
{2 3 4 5}
{1 2 3 4 5 }
數 | 出現次數 |
---|---|
1 | 5 |
2 | 8 |
3 | 9 |
4 | 8 |
5 | 5 |
區間:
{1}
{2}
{3}
{4}
{5}
{6}
{1 2}
{2 3}
{3 4}
{4 5}
{5 6}
{1 2 3}
{2 3 4}
{3 4 5}
{4 5 6}
{1 2 3 4}
{2 3 4 5}
{3 4 5 6}
{1 2 3 4 5}
{2 3 4 5 6}
{1 2 3 4 5 6}
數 | 出現次數 |
---|---|
1 | 6 |
2 | 10 |
3 | 12 |
4 | 12 |
5 | 10 |
6 | 6 |
數:1 2 3 4 5 6 7 8 9 10
區間:
{1}
{2}
{3}
{4}
{5}
{6}
{7}
{8}
{9}
{10}
{1 2}
{2 3}
{3 4}
{4 5}
{5 6}
{6 7}
{7 8}
{8 9}
{9 10}
{1 2 3}
{2 3 4}
{3 4 5}
{4 5 6}
{5 6 7}
{6 7 8}
{7 8 9}
{8 9 10}
{1 2 3 4}
{2 3 4 5}
{3 4 5 6}
{4 5 6 7}
{5 6 7 8}
{6 7 8 9}
{7 8 9 10}
{1 2 3 4 5}
{2 3 4 5 6}
{3 4 5 6 7}
{4 5 6 7 8}
{5 6 7 8 9}
{6 7 8 9 10}
{1 2 3 4 5 6}
{2 3 4 5 6 7 }
{3 4 5 6 7 8}
{4 5 6 7 8 9 }
{5 6 7 8 9 10}
{1 2 3 4 5 6 7}
{2 3 4 5 6 7 8}
{3 4 5 6 7 8 9}
{4 5 6 7 8 9 10}
{1 2 3 4 5 6 7 8}
{2 3 4 5 6 7 8 9}
{3 4 5 6 7 8 9 10}
{1 2 3 4 5 6 7 8 9}
{2 3 4 5 6 7 8 9 10}
{1 2 3 4 5 6 7 8 9 10}
數 | 出現的次數 |
---|---|
1 | 10 |
2 | 18 |
3 | 24 |
4 | 28 |
5 | 30 |
6 | 30 |
7 | 28 |
8 | 24 |
9 | 18 |
10 | 10 |
然後我推了這麼多,發現區間裏第i個數,在所有區間裏面出現的總次數是** i*(n-i+1) **
在計算區間和的和的時候,計算每個區間出現的次數,然後乘以數值就可以計算了。
但是因爲這一題要取模所以要注意一下,可能有些需要開long long ,當時評測的時候評測機針對我。後來改的時候,把所有的int改成了long long就過了。
代碼:
#include<bits/stdc++.h>
using namespace std;
long long n;
long long ans;
const long long k=1e9+7;
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%lld",&n);
for (int i=1;i<=n;i++)
{
long long x;
scanf("%lld",&x);
ans=(ans+x*i%k*(n-i+1)%k)%k;
}
printf("%lld\n",ans);
return 0;
}