code:
#include<iostream>
using namespace std;
const int mod = 10007;
const int N = 1e5 + 10;
int n,m;
int number[N],color[N];
int s1[N][2],s2[N][2];
//s1[i][x]:颜色是i,是奇/偶(1/0) 的元素数量
//s2[i][x]:颜色是i,是奇/偶(1/0) 的元素number之和
int ans;
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &number[i]);
}
for(int i = 1; i <= n; i++){
scanf("%d", &color[i]);
s1[color[i]][i % 2]++;
//数量增加
s2[color[i]][i % 2] = ( s2[color[i]][i % 2] + number[i] ) % mod;
//数字和增加
}
for(int i = 1; i <= n; i++){
int c = color[i];
// ans += i * (( s2[c][i % 2] - number[i] ) % mod + ((number[i] % mod) * (( s1[c][i % 2] - 1 ) % mod ) % mod ) ) % mod;
ans += i * (s2[c][i % 2] + number[i] * ( s1[c][i % 2] - 2 ) % mod) % mod;
ans %= mod;
}
printf("%d", ans);
return 0;
}
1:
ans += i * (( s2[c][i % 2] - number[i] ) % mod + ((number[i] % mod) * (( s1[c][i % 2] - 1 ) % mod ) % mod ) ) % mod;
2:
ans += i * (s2[c][i % 2] + number[i] * ( s1[c][i % 2] - 2 ) % mod) % mod;
为什么1式子会产生负数,而2式子是正确的?