洛谷P2671 求和 數論

2022-04-30 09:15:11 字數 1432 閱讀 7681

題目傳送門

格式難調,題面就不放了。

分析:$zyys$的一道題。

很顯然是大力推公式。我們分析一下題目,實際上限制條件就是:下標同奇偶且顏色相同的數,那麼我們先拿這個公式$(x+z)*(num_x+num_z)$套三個變數$x,y,z$推一下:

$(x+z)*(num_x+num_z)=num_x*x+num_z*z+num_x*z+num_z*x$

$(x+y)*(num_x+num_y)=num_x*x+num_y*y+num_x*y+num_y*x$

$(z+y)*(num_z+num_y)=num_z*z+num_y*y+num_z*y+num_y*z$

然後求和得到:

$tot=num_x*(x+y+z)+num_x*x+num_y*(x+y+z)+num_y*y+num_z*(x+y+z)+num_z*z$

如果我們把它變成普適公式,就是:(其中的$cnt$表示元素個數)

$tot=\sum_x (num_x*x*(cnt-2))+\sum_x x*\sum_x num_x$

當然,這只是同一種顏色在同奇偶的情況下的和,在擴大到全部範圍,那就是:

$ans=\sum_\sum_tot$

$=\sum_\sum_(\sum_x (num_x*x*(cnt-2))+\sum_x x*\sum_x num_x)$

用字首和優化一下,然後求和就行了。

**略醜。

code:

//

it is made by holselee on 23rd oct 2018

p2671

#include#include

#include

#include

#define mod (10007)

using

namespace

std;

typedef

long

long

ll;const ll n=1e5+7

;ll n,m,a[n],col[n],num[n][

2],sum[n][2],suma[n][2],cnt[n][2

],ans;

//a就是題目中的數值,num是下標和,sum是a[i]*i的和

//suma是a的和,cnt是同奇偶且顏色相同的元素個數

intmain()

for(ll i=1; i<=m; ++i)

for(ll j=0; j<=1; ++j)

cout

<'\n'

;

return0;

}

洛谷 P2671 求和

想要oi學得好,數學肯定不能少 看來我是永遠也學不好了 此篇博文較長 廢話較多 您可以選擇 寫在最前面 其實不需要用 long long 型別,只需在兩數相乘時先取模一次就行了 為什麼可行,請參見取模的百科 又是該死的數學知識 在下面的 中,既有用 long long 的,又有用 int 的,也是因...

洛谷 P2671 求和 解題報告

一條狹長的紙帶被均勻劃分出了 n 個格仔,格仔編號從 1 到 n 每個格仔上都染了一種顏色 color i 用 1,m 當中的乙個整數表示 並且寫了乙個數字 number i 定義一種特殊的三元組 x,y,z 其中 x,y,z 都代表紙帶上格仔的編號,這裡的三元組要求滿足以下兩個條件 xyz 是整數...

NOIP2015PJ 洛谷 P2671 求和

直接暴力肯定是不行的,我們需要把各種相同的顏色分離出來計算。但是只分離出來沒有用,因為三元組要求中間有乙個y。可以看出,x和z的奇偶性相同時,存在y使三元組成立。所以我們用兩個陣列儲存相同顏色的奇 偶情況,每次計算就變成計算這個序列的值。則原式 num 1 num 2 a num 1 a num 2...