NOIP2015 普及組第三題 求和(sum.cpp)

瘋狂的函數 2022-01-07 20:34:00 阅读数:173

noip2015 noip 普及 第三 求和

題目描述

一條狹長的紙帶被均勻劃分出了 n 個格子,格子編號從 1 到 n。每個格子上都染了一種顏色colori(用[1,m]當中的一個整數錶示),並且寫了一個數字numberi。

定義一種特殊的三元組:(x, y, z),其中 x,y,z 都代錶紙帶上格子的編號,這裏的三元組要求滿足以下兩個條件:
1. x, y, z都是整數, x < y < z, y − x = z − y
2. colorx = colorz

滿足上述條件的**三元組的分數**規定為(x + z) ∗ (numberx + numberz)。**整個紙帶的分數**規定為所有滿足條件的三元組的分數的和。這個分數可能會很大,你只要輸出整個紙帶的分數除以 10,007 所得的餘數即可。

輸入

輸入文件為sum.in

第一行是用一個空格隔開的兩個正整數 n 和 m,n 代錶紙帶上格子的個數,m 代錶紙帶上 顏色的種類數。

第二行有 n 個用空格隔開的正整數,第 i 個數字numberinumber_inumberi代錶紙帶上編號為 i 的格子上面寫的數字。

第三行有 n 個用空格隔開的正整數,第 i 個數字coloricolor_icolori代錶紙帶上編號為 i 的格子染的顏色。

輸出

輸出文件為sum.out

共一行,一個整數,錶示所求的紙帶分數除以 10,007 所得的餘數。

樣例輸入

樣例輸入1
6 2
5 5 3 2 2 2
2 2 1 1 2 1
樣例輸入2
15 4
5 10 8 2 2 2 9 9 7 7 5 6 4 2 4
2 2 3 3 4 3 3 2 4 4 4 4 1 1 1

樣例輸出

樣例輸出1
82
樣例輸出2
1388

提示

對於第 1 組至第 2 組數據,1 ≤ n ≤ 100, 1 ≤ m ≤ 5; 對於第 3 組至第 4 組數據,1 ≤ n ≤ 3000, 1 ≤ m ≤ 100;

對於第 5 組至第 6 組數據,1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000,且不存在出現次數超過 20 的顏色;

對於全部 10 組數據, 1 ≤ n ≤ 100000, 1 ≤ m ≤ 100000, 1 ≤ coloricolor_icolori ≤ m, 1 ≤ numberinumber_inumberi ≤ 100000。

【輸入輸出樣例 1 說明】

紙帶如題目描述中的圖所示。

所有滿足條件的三元組為:(1, 3, 5), (4, 5, 6)。

所以紙帶的分數為(1 + 5) ∗ (5 + 2) + (4 + 6) ∗ (2 + 2) = 42 + 40 = 82。

程序實現

#include<bits/stdc++.h>
using namespace std;
int s[100005][2],sum[100005][2],c[100005],x[100005],n,m,ans;
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>x[i];
}
for (int i=1;i<=n;i++){
cin>>c[i];
s[c[i]][i%2]++;
sum[c[i]][i%2]=(sum[c[i]][i%2]+x[i])%10007;
}
for(int i=1;i<=n;i++){
ans=(ans+i*((s[c[i]][i%2]-2)*x[i]%10007+sum[c[i]][i%2]))%10007;
}
cout<<ans;
return 0;
}

版权声明:本文为[瘋狂的函數]所创,转载请带上原文链接,感谢。 https://gsmany.com/2022/01/202201072034000812.html