题目描述 一条狭长的纸带被均匀划分出了 n n 个格子,格子编号从 1 1 到 n n。每个格子上都染了一种颜色 c o l o r i color i 用 [ 1 , m ] [1,m] 当中的一个整数表示,并且写了一个数字 n u m b e r i number i 。
定义一种特殊的三元组: ( x , y , z ) (x,y,z),其中 x , y , z x,y,z 都代表纸带上格子的编号,这里的三元组要求满足以下两个条件:
c o l o r z color x =color z
满足上述条件的三元组的分数规定为 ( x + z ) × ( n u m b e r x + n u m b e r z ) (x+z)×(number x +number z )。整个纸带的分数规定为所有满足条件的三元组的分数的和。注意这个分数可能会很大,你只要输出整个纸带的分数除以 10007 10007 所得的余数即可。
输入格式 第一行是用一个空格隔开的两个正整数 n n 和 m , n m,n 表纸带上格子的个数, m m 表纸带上颜色的种类数。
第二行有 n n 用空格隔开的正整数,第 i i 数字 n u m b e r number 表纸带上编号为 i i 格子上面写的数字。
第三行有 n n 用空格隔开的正整数,第 i i 数字 c o l o r color 表纸带上编号为 i i 格子染的颜色。
输出格式 共一行,一个整数,表示所求的纸带分数除以 10007 10007 所得的余数。
82 (1+5)×(5+2)+(4+6)×(2+2)=42+40=82。
数据范围
20 % 20%的数据, 1 ≤ n ≤ 100 1≤n≤100
40 % 40%的数据, 1 ≤ n ≤ 3000 1≤n≤3000
100 % 100%的数据, 1 ≤ n ≤ 100000 , 1 ≤ m ≤ 100000 , 1 ≤ c o l o r i ≤ m , 1 ≤ n u m b e r i ≤ 100000 1≤n≤100000,1≤m≤100000,1≤color i ≤m,1≤number i ≤100000
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,mod=1e5+7;
int s[N][2],sum[N][2],c[N],x[N],n,m,ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&x[i]);
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
s[c[i]][i%2]++;
sum[c[i]][i%2]=(sum[c[i]][i%2]+x[i])%mod;
}
for(int i=1;i<=n;i++)
ans=(ans+i*(sum[c[i]][i%2]+x[i]*(s[c[i]][i%2]-2)%mod))%mod;
cout<<ans;
return 0;
}