读题,我们发现完全可以暴力
那这必然过不了
观察题目,对式一进行移项,发现
于是我们便可以枚举或
当然这个复杂度也是过不了的
做到这个地步,我们似乎基本没有用到颜色
于是我们便可以向颜色上靠,可以利用分组的思想,将同一颜色分成一组,又根据
可以把相同颜色的分为奇偶两组
那怎么样得出最后答案呢
我们可以对分数的计算: 进行一定的处理
我们提前设定为第i个的颜色
s[c[i]][i%2]为颜色为c[i]的个数
我们设为下标,
为值
将有关f[1]的式子提出来找规律
乘出来
将有关f[1]的式子提出来
将这个式子
得
显然后面的可以用前缀和求出来
#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<cstdio>
#include<vector>
#include<ctime>
#include<unordered_map>
#include<map>
#include<cstdlib>
#include<iomanip>
#include<queue>
#include<set>
#include<stack>
#include<algorithm>
#include<fstream>
using namespace std;
int f[1000000][5],n[1000000][5],nn[1000000][5],ff[1000000][5],X[1000000][5];
int c[1000000],s[1000000][5],y[1000000];
int main()
{
int k,m;
cin>>k>>m;
for(int i=1;i<=k;i++)
cin>>y[i];
for(int i=1;i<=k;i++)
{
cin>>c[i];
s[c[i]][i%2]++;
n[c[i]][i%2]=(n[c[i]][i%2]+y[i])%10007;
}
int ans=0;
for(int i=1;i<=k;i++)
ans=(ans+i*(1LL*(s[c[i]][i%2]-2)*y[i]+n[c[i]][i%2]))%10007;
cout<<ans;
return 0;
}
记得开
long long