我觉得我公式是没有推错的。提交结果是这个。
#include <bits/stdc++.h>
using namespace std;
#define MAXM 100005
#define MAXN 100005
#define Mod 10007
int N, M;
int nums[MAXN] = {0}; // 记录数字
long long cnt[MAXM][2] = {0}; // 每个颜色有几个
long long sum1[MAXM][2] = {0}; // \sum x_m * y_m
long long sum2[MAXM][2] = {0}; // \sum x_m
long long sum3[MAXM][2] = {0}; // \sum y_m
long long sum = 0;
int main(){
cin>>N>>M;
int tmp;
int j;
for(int i = 1; i <= N; i++){
cin>>nums[i];
}
for(int i = 1; i <= N; i++){
cin>>j;
cnt[j][i%2]++;
sum1[j][i%2] = (i * nums[i] + sum1[j][i%2]) % Mod;
sum2[j][i%2] = (i + sum2[j][i%2]) % Mod;
sum3[j][i%2] = (nums[i] + sum3[j][i%2]) % Mod;
}
for(int j = 1; j <= M; j++){
for(int k = 0; k <= 1; k++){
if(cnt[j][k] >= 2){
sum = (sum + (cnt[j][k] - 2) * sum1[j][k]) % Mod;
sum = (sum + sum2[j][k] * sum3[j][k]) % Mod;
}
}
}
cout<<sum;
return 0;
}