複賽模擬-19-11-08-T1區間和的和

區間和的和

題目描述

輸入一個長度爲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;
} 
發佈了40 篇原創文章 · 獲贊 9 · 訪問量 5722
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章