以前:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 110000, P = 10007;
int n, m, a[N], c[N];
ll ans, s[N], s1[N], s2[N], col[N], num[N][2], sum[N][2], cnt[N][2], ss[N][2];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
for (int i = n - 2; i; i--) {
sum[c[i + 2]][i & 1] += 0LL + a[i + 2];
sum[c[i + 2]][i & 1] %= P;
s1[i] = sum[c[i]][i & 1];
cnt[c[i + 2]][i & 1] += 0LL + i + 2;
cnt[c[i + 2]][i & 1] %= P;
s2[i] = cnt[c[i]][i & 1];
ss[c[i + 2]][i & 1] += 1LL * (i + 2) * a[i + 2];
ss[c[i + 2]][i & 1] %= P;
s[i] = ss[c[i]][i & 1];
num[c[i + 2]][i & 1]++;
col[i] = num[c[i]][i & 1];
}
for (int i = 1; i <= n; i++) if (s2[i])
ans += 1LL * col[i] * i * a[i] + s[i] + 1LL * i * s1[i] + 1LL * a[i] * s2[i], ans %= P;
printf("%lld\n", ans);
return 0;
}
/* (x + z) * (a[x] + a[z])
x * a[x] + z * a[z] + z * a[x] + x * a[z]
i * ((c[i + 2] == c[i]) * a[i + 2] + a[i + 4] + ……) + a[i] * (i + 2 + i + 4 + ……)
15 4
5 108 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 "4" 3 3 2 4 4 4 4 1 1 1
5 10 9 8 10 12
(5 + 9) * (a[5] + a[9]) + (5 + 11) * (a[5] + a[11])
5 * a[5] + 5 * a[5]
*/
Now:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 110000, P = 10007;
int n, m, a[N], c[N];
ll ans, s[N], s1[N], s2[N], col[N], num[N][2], sum[N][2], cnt[N][2], ss[N][2];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
for (int i = n - 2; i; i--) {
sum[c[i + 2]][i & 1] += 0LL + a[i + 2];
// sum[c[i + 2]][i & 1] %= P;
s1[i] = sum[c[i]][i & 1];
cnt[c[i + 2]][i & 1] += 0LL + i + 2;
// cnt[c[i + 2]][i & 1] %= P;
s2[i] = cnt[c[i]][i & 1];
ss[c[i + 2]][i & 1] += 1LL * (i + 2) * a[i + 2];
// ss[c[i + 2]][i & 1] %= P;
s[i] = ss[c[i]][i & 1];
num[c[i + 2]][i & 1]++;
col[i] = num[c[i]][i & 1];
}
for (int i = 1; i <= n; i++) if (s2[i])
ans += 1LL * col[i] * i * a[i] + s[i] + 1LL * i * s1[i] + 1LL * a[i] * s2[i];
printf("%lld\n", ans % P);
return 0;
}
/* (x + z) * (a[x] + a[z])
x * a[x] + z * a[z] + z * a[x] + x * a[z]
i * ((c[i + 2] == c[i]) * a[i + 2] + a[i + 4] + ……) + a[i] * (i + 2 + i + 4 + ……)
15 4
5 108 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 "4" 3 3 2 4 4 4 4 1 1 1
5 10 9 8 10 12
(5 + 9) * (a[5] + a[9]) + (5 + 11) * (a[5] + a[11])
5 * a[5] + 5 * a[5]
*/
qwq