NOIP2015 求和
#include<cstdio> #define UP(a,b,c) for(int a=(b);a<=(c);a++) using namespace std; typedef long long LL; const int N=100010,MOD=10007; LL n,m,a[N],c[N],num[N][2],si[N][2],sn[N][2],ss[N][2],x; int main(){ scanf("%lld%lld",&n,&m); UP(i,1,n)scanf("%lld",&a[i]); UP(i,1,n)scanf("%lld",&c[i]); UP(i,1,n){ num[c[i]][i&1]++; si[c[i]][i&1]+=i%MOD; sn[c[i]][i&1]+=a[i]%MOD; ss[c[i]][i&1]+=a[i]*i%MOD; } UP(i,1,m)UP(j,0,1) if(num[i][j]>1)x=(x+(si[i][j]*sn[i][j])%MOD+(num[i][j]-2)*ss[i][j])%MOD; printf("%lld\n",x); return 0; }
#include<cstdio> #define FOR(a,b,c) for(int a=(b);a<=(c);a++) using namespace std; typedef long long LL; const int maxn=100000+10; const int MOD=10007; LL n,m,a[maxn],c[maxn],sr[maxn][2],sa[maxn][2],s[maxn][2],sq[maxn][2]; int main(){ scanf("%lld%lld",&n,&m); FOR(i,1,n)scanf("%lld",&a[i]); FOR(i,1,n)scanf("%lld",&c[i]); LL ans=0; FOR(i,1,n){ int p=i&1,ci=c[i]; s[ci][p]++; if(s[ci][p]>1) ans+=(a[i]*sr[ci][p])%MOD+(i*sa[ci][p])%MOD+sq[ci][p]+((s[ci][p]-1)*i*a[i]%MOD); ans%=MOD; sr[ci][p]+=i; sa[ci][p]+=a[i]; sq[ci][p]+=i*a[i]; } ans%=MOD; printf("%lld\n",ans); return 0; }