【正经题解】求和
2024-02-20 17:19:10
发布于:浙江
14阅读
0回复
0点赞
首先我们明确这个三元组更y没有关系
第一个条件实则是说x%2==z%2
第二个条件就是颜色相同
那么我们不妨在拿到一个数以后就把它按颜色,%2的结果分类
(x+z)*(number_x+number_z) = x * number_x + x * number_z + z * number_x + z * number_z
那如果已知z,考虑所有x就可以看做:
p表示该分组的个数
第一部分:代码里的sum1
((x1 * number_x1) + (x2 * number_x2) + ... + (xp * number_xp))
第二部分:
(编号(1)...编号(p))*(number_z)
第三部分
(number_1...number_p)* (z )
第四部分
p*(z * number_z)
#include <cstdio>
using namespace std;
long long sum1[100005][2], sum2[100005][2], sum3[100005][2], sum4[100005][2];
//sum1 对应部分1
//sum2 对应编号(1)...编号(p)的和
//sum3 对应p
//sum4 对应number_1...number_p 的和
long long number[100005], color[100005];
//由于后面代码要做乘法,故使用long long防止溢出(这个**错误蒟蒻调了n久)
int main()
{
int n, m;
scanf("%d %d", &n, &m);
long long i;
for (i = 1; i <= n; i++)
scanf("%d", &number[i]);
for (i = 1; i <= n; i++)
scanf("%d", &color[i]);
long long tot = 0;
long long t1, t2;
for (i = 1; i <= n; i++)
{
//如算法所讲加上以i为z的三元组的分数和
t1 = color[i];
t2 = i % 2;
tot += sum1[t1][t2];
tot %= 10007;
tot += (sum2[t1][t2] * number[i]) % 10007;
tot %= 10007;
tot += (((sum3[t1][t2] * i) % 10007) * number[i]) % 10007;
tot %= 10007;
tot += (sum4[t1][t2] * i) % 10007;
tot %= 10007;
//更新依赖的值
sum1[t1][t2] += (i * number[i]) % 10007;
sum1[t1][t2] %= 10007;
sum2[t1][t2] += i;
sum2[t1][t2] %= 10007;
sum3[t1][t2]++;
sum3[t1][t2] %= 10007;
sum4[t1][t2] += number[i];
sum4[t1][t2] %= 10007;
}
//输出
printf("%lld", tot);
return 0;
}
这里空空如也
有帮助,赞一个