6 2
5 5 3 2 2 2
2 2 1 1 2 1
82
15 4
5 10 8 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
1388
我们就可以把同色,同单双的数分到一类计算分数。
简化计算公式,用前缀和优化一下即可。
具体如下:
对于某组第一个点来说,需要乘上它的编号的有 t-1组(它本身的num+其他点的num)(如上图的式子,用一个sum在读入的时候就加上所有数的num,这里已经有一个第一个点的num。剩下需要加的就是t-2个num。
#include
#define ll long long
#define mod 10007
ll n,m,ans,num[1000001],color[1000001],t[1000001][5],sum[1000001][5];
int main(){
scanf("%lld%lld", &n, &m);
for(ll i = 1; i <= n; ++i)
scanf("%lld", &num[i]);
for(ll i = 1; i <= n; ++i){
scanf("%lld",&color[i]);
++t[color[i]][i % 2]; //同类数量
sum[color[i]][i % 2] = (sum[color[i]][i % 2] + num[i]) % mod;
//同类的数字和
}
for(ll i = 1; i <= n; ++i)
ans = (ans + i * ((t[color[i]][i%2]-2) * num[i] + sum[color[i]][i%2]) % mod) % mod;
//如上
printf("%lld", ans);
}