把(0,0)也視為乙個ki
。顯然要容斥原理。
列舉乙個s,去求至少有s步是不合法的方案數。
這個要dp三個東西。fi
,j表示走了i步,∑k
=j*10的方案數。
橫縱座標沒有關聯,可以分開dp。pi
,j表示走了i步,橫座標之和為j的方案數。qi
,j表示走了i步,縱座標之和為j的方案數。那麼a
ns=∑
i,j(
−1)i
∗(ri
)∗fi
,j∗p
r−i,
tx−j
∗10∗q
r−i,
ty−j
∗10
這個為什麼是對的呢。
考慮一種確切的走法,它有t步是不合法的。
在上面那個式子中,它會被計算∑t
i=0(
−1)i
∗(ti
)=[t
=0]
所以上面那個式子剛好只會計算沒有出現過不合法的方案數。
這個好像是先有結論再有證明,但是似乎也只能是這樣了。
#include
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using
namespace
std;
const
int mo = 1e4 + 7;
int tx, ty, mx, my, r, k, k[55], ans, bz[81];
int f[1605][81], p[1605][801], q[1605][801], s[801], c[1601][1601];
int main()
fo(j, 0, ty) s[j] = 1;
fo(i, 1, r)
c[0][0] = 1;
fo(i, 1, r)
fo(i, 0, r) fo(j, 0, min(tx, ty) / 10)
ans += ((i % 2) ? -1 : 1) * f[i][j] % mo * p[r - i][tx - j * 10] % mo * q[r - i][ty - j * 10] % mo * c[r][i] % mo;
printf("%d", (ans % mo + mo) % mo);
}
GDOI模擬4 24 4 26總結DAY1
day1 第一題,一看就知道是字尾陣列,不過忘記了字尾陣列有乙個東西怎麼線性處理,所以就只能夠暴力搞字尾陣列,所以也只能暴力搞字尾陣列,然後暴力的來求。把height從大到小填進去是乙個很套路的東西,但是只打過一次字尾陣列,對他的用法還不太熟練。所以對於很多省選的知識,由於打得不多,所以很多東西還不...
GDOI2018模擬7 8 質數
將1 n分成盡可能小的集合,使得每個集合的元素均為質數 乙個數n n 6000 第一行乙個數m表示分成幾塊 第二行n個1 m的數表示每個數分到哪一塊 2 1 2 2 1 1 1 1 2 這題很有趣 我們知道有個哥德 猜想 任意乙個足夠大的偶數可以分成兩個質數的和 由於目前人類沒有證明出它是錯的,而且...
GDOI2018模擬8 11 決戰
聽說暴力狀壓可以過?然而我常數不好只有90分 考慮普通的狀壓,f i s j 表示當前填到第i行,第i行的狀態為s,用了j個哲學 家的方案數 我們把最後一維看做多項式,用x j的係數表示答案 咦?模數是998244353哦,那我們是不是可以用ntt加速呢?如果我們求出對於所有wi 答案的多項式的點值...