NOIP2015pj求和

Candy?發表於2016-08-21

題目描述

一條狹長的紙帶被均勻劃分出了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;
}

 

 

相關文章