#include using namespace std; const int N = 100010, mod = 10007; int w[N]; // 第i个格子的数字 int c[N]; // 第i个格子的颜色 int s[N][2]; // s[i][0]:颜色为i、编号为偶数格子上数字的和 // s[i][1]:颜色为i、编号为奇数格子上数字的和 int cnt[N][2]; // cnt[i][0]:颜色为i、编号为偶数格子的个数 // cnt[i][1]:颜色为i、编号为奇数格子的个数 int main() { int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) cin >> w[i]; // 第i个格子的数字 // 预处理 for (int i = 1; i <= n; i++) { // 遍历每个格子 cin >> c[i]; // 格子颜色c[i] /* 装入不同的组中,组划分是两个规则: ① 颜色必须相同 ② 奇偶性必须相同 所以,c[i]相同的放到同一个颜色组内,并且,在同一个颜色组内,奇偶数还必须相同。 s[][]:随着i的不断向后遍历,s中记录了相同颜色,相同奇偶性的格子,数字的累加和 cnt[][]:记录每个分组中的格子个数 */ s[c[i]][i % 2] = (s[c[i]][i % 2] + w[i]) % mod; // 累加分组内数字和 cnt[c[i]][i % 2]++; // 维护分组内格子个数 } int ans = 0; for (int i = 1; i <= n; i++) // 枚举每个格子 /* Q:这个格子在哪个分组里呢? 答: (1) c[i] : 按颜色划分 (2) i % 2 : 按奇偶性划分 Q:这个分组中格子的数量是多少呢? 答: cnt[c[i]][i % 2] */ ans = (ans + i * ((cnt[c[i]][i % 2] - 2) * w[i] % mod + s[c[i]][i % 2])) % mod; printf("%d\n", ans); return 0; }