題目描述
一條狹長的紙帶被均勻劃分出了n個格子,格子編號從1到n。每個格子上都染了一種顏色color_i用[1,m]當中的一個整數表示),並且寫了一個數字number_i。
定義一種特殊的三元組:(x,y,z),其中x,y,z都代表紙帶上格子的編號,這裡的三元
組要求滿足以下兩個條件:
1.xyz是整數,x<y<z,y-x=z-y
2.colorx=colorz
滿足上述條件的三元組的分數規定為(x+z)*(number_x+number_z。整個紙帶的分數
規定為所有滿足條件的三元組的分數的和。這個分數可能會很大,你只要輸出整個紙帶的分數除以10,007所得的餘數即可。
-------------------------------------------------------------------------------------------------------------------
需要一點數學推導,對於一種顏色,就是sigma奇*sigma num奇+sigma偶*sigma num偶+奇*num*(cnt奇-2)+偶*num*(cnt偶-2)
預處理sum和cnt陣列,然後掃一遍統計答案行了
WARN:一定多%%%%%%%%%%%%
#include <iostream> #include <cstdio> using namespace std; const int N=1e5+5,MOD=10007; inline int read(){ char c=getchar(); int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int n,m,ans=0; int col[N],num[N],sum[2][N],cnt[2][N]; int main(int argc, const char * argv[]) { n=read();m=read(); for(int i=1;i<=n;i++) num[i]=read()%MOD; for(int i=1;i<=n;i++){ col[i]=read(); sum[i%2][col[i]]=(sum[i%2][col[i]]+num[i])%MOD; cnt[i%2][col[i]]++; } for(int i=1;i<=n;i++){ // ans=(ans+(i%MOD*sum[i%2][col[i]])%MOD+(i%MOD*num[i]*(cnt[i%2][col[i]]-2)+MOD)%MOD)%MOD; ans=(ans+i%10007*((sum[i%2][col[i]]+(cnt[i%2][col[i]]-2)%10007*num[i]+10007)%10007))%10007; } cout<<ans; return 0; }