[NOIP2015 普及组] 求和
2024年12月25日小于 1 分钟
做法 1
#include <bits/stdc++.h>
using namespace std;
const int MODNUM = 10007;
int n, m;
int number[100005];
int color[100005];
int sumOdd[100005];
vector<int> odd[100005];
int sumEven[100005];
vector<int> even[100005];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> number[i];
number[i] %= MODNUM;
}
for (int i = 1; i <= n; i++)
{
cin >> color[i];
if (i % 2)
odd[color[i]].push_back(i),
sumOdd[color[i]] = (sumOdd[color[i]] + number[i]) % MODNUM;
else
even[color[i]].push_back(i),
sumEven[color[i]] = (sumEven[color[i]] + number[i]) % MODNUM;
}
int ans = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 0; j < odd[i].size(); j++)
{
int x = odd[i][j];
ans = (ans + x * (sumOdd[i] - number[x] + MODNUM) % MODNUM) % MODNUM;
ans = (ans + (odd[i].size() - 1) * x % MODNUM * number[x] % MODNUM) % MODNUM;
}
for (int j = 0; j < even[i].size(); j++)
{
int x = even[i][j];
ans = (ans + x * (sumEven[i] - number[x] + MODNUM) % MODNUM) % MODNUM;
ans = (ans + (even[i].size() - 1) * x % MODNUM * number[x] % MODNUM) % MODNUM;
}
}
cout << ans << "\n";
return 0;
}