給你乙個數a,以及一串全是數字的字串以構造矩陣c,c[i][j]=a[i]*a[j](a[k]表示字串中第k位所代表的數字).請你求出權值之和恰好為a的子矩陣個數.
此題比較有意思.題目要我們求的答案即滿足$(\sum_^\sum_^ c[i][j]) ==a$的四元組[x,y,u,v]個數.接下來我們分析一下這個式子:$$\sum_^\sum_^c[i][j]=\sum_^\sum_^ a[i] \cdot a[j]=\sum_^(a[i] \cdot \sum_^a[j])=\sum_^a[i] \cdot \sum_^a[j]$$$$=(sum[u]-sum[x-1]) \cdot (sum[v]-sum[y-1])$$
其中sum陣列為字首和.由於n比較小$(n\in 4000)$,所以我們可以n²預處理出字首和之差,然後運用乘法原理組合即可.值得注意的是,當a==0時,由於0乘以任何數結果均為0,所以要特殊處理,0*0的矩陣被我們算了兩次,所以要減掉一次.
#include#include#include
#include
#include
#include
#define r register
#define next exnttttttttttttttttttttt
#define debug puts("mlg")
using
namespace
std;
typedef
long
long
ll;typedef
long
double
ld;typedef unsigned
long
long
ull;
inline ll read();
inline
void
write(ll x);
inline
void
writesp(ll x);
inline
void
writeln(ll x);
ll a;
char
wn;ll num[
6000
],n;
ll used[
150000],sum[150000
];ll ans;
intmain()
for(r ll i=1;i<=n;i++)
for(r ll i=1;i<=n;i++)
}if(a==0
)
for(r ll i=1;i<=120000;i++)
}writeln(ans);
}inline ll read()
while(ch>='
0'&&ch<='9'
)
return x*t;
}inline
void
write(ll x)
if(x<=9)
write(x/10);putchar(x%10+'0'
);}inline
void
writesp(ll x)
inline
void
writeln(ll x)
20200721NOIP提高組模擬T3 最小代價
給你n個點 n leq100000 所構成的邊帶權的無向圖,每個點都有黑或白兩種顏色之一,其中黑記為1,白記為0.現在要你選擇一些邊 選擇一條邊的代價即為此邊權值 用這些邊構成新的圖,使得新圖中每個白點都與黑點聯通,且每個白點到距離其最近的黑點的距離等於原圖中的最短距離.若不存在這樣的圖,輸出imp...
NOIP提高組 矩陣
在麥克雷的面前出現了乙個有n m個格仔的矩陣,每個格仔用 或 表示,表示這個格仔可以放東西,則表示這個格仔不能放東西。現在他拿著一條1 2大小的木棒,好奇的他想知道對於一些子矩陣,有多少種放木棒的方案。因為棍子是1 2的,所以很容易就能發現,兩個被分割的塊,除了跨越兩個塊擺放木棍的方案數會對答案有影...
NOIP提高組2005 過河
過河 river 問題描述 在河上有一座獨木橋,乙隻青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由於橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的點看成數軸上的一串整點 0,1,l 其中l是橋的長度 座標為0的點表示橋的起點,座標為l的...