每日一题 — 2020 - 04 - 20

题目链接

这题主要是推数学公式,然后进行计算就OK了,没想到的是竟然取模掉坑了,可能好久没做取模题了


解题思路:

  • 这个题如果暴力的话n^2,肯定会超时的,所以最好是nlogn或n
  • 所以我们之间将式子展开,结果展开后发现规律与式子
 第一项 (n - 1* a[0] * a[0] - 2 * a[0] * (a[1] + a[2] + ....a[n])
 第二项 (n - 1* a[1] * a[1] - 2 * a[1] * (a[2] + a[3] + ....a[n])
  • 所以我们可以看出,前面为(n - 1) * a[i] *a[i]
  • 后一项 2 * a[i] * (a[i + 1] + a[i + 2] + …a[n])
  • 注意取模,如果不行就分步来做

需要注意的是:

  • 记住如果有负数,那么我们还需要 + mod ) % mod

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

const int N = 500010;
const int mod = 1e9+7;

long long a[N];

int main(){
	int n;
	scanf("%d",&n);
	long long res = 0;
	for (int i = 0; i < n; i ++){
		scanf("%lld",&a[i]);
		res += a[i];
	}

	long long ans = 0;
	
	// res sum
	long long sum = 0;
    
	for (int i = 0; i < n; i++){
		sum += a[i];
		//ans = ((ans % mod + ((((n - 1) * a[i] % mod) % mod * a[i])%mod)) % mod  - (((2 * a[i]) %mod) * ((res - sum)%mod)%mod)%mod)%mod;
		
        long long x = (n - 1) * a[i] % mod * a[i] % mod;
        long long y = 2 * a[i] %mod *((res - sum) % mod) % mod;
        long long z = (x - y + ans + mod)% mod;
        ans = z;
	}

	printf("%lld\n",ans);
}
发布了121 篇原创文章 · 获赞 7 · 访问量 4315

猜你喜欢

转载自blog.csdn.net/LiangNiuMu/article/details/105627260