題目傳送門
格式難調,題面就不放了。
分析:$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...