題目大意:有$m(m\leqslant10^8)$個人站成一排,有$n(n\leqslant10^4)$個糖果,若第$i$個人沒有糖果,那麼第$i+1$個人也沒有糖果。乙個人有$x$個糖果會獲得快樂值$v(x)$。
$$v(x)=
\begin
ax^2+bx+c&(x>1)\\
1&(x=1)
\end
$$乙個方案的價值為$\prod\limits_^mv(s_i)$($s_i$為第$i$個人得到的糖果數)。問所有方案的價值和,對$mod(mod\leqslant255)$取模
題解:令$f(x)=\sum\limits_^v(i)x^i$,那麼$k$個人全部得到糖果的方案數是$[x^n]f^k(x)$。
$$\begin
ans&=[x^n]\sum\limits_^mf^i(x)\\
&=[x^n]\sum\limits_^mf^i(x)\\
&=[x^n]\dfrac(x)}
\end
$$注意這裡的模數不是質數,但很小,可以用一模$ntt$,注意求逆部分,需要多把點值轉成係數,因為負數無法表示。
卡點:$ntt$預處理部分度數沒有加,調了乙個上午。。。
c++ code:
#include #include #include #define maxn 32768const int mod = 998244353;
namespace math
inline int inv(int x)
}inline void reduce(int &x)
inline void clear(register int *l, const int *r)
int n, m, a, b, c, pmod;
namespace poly
inline void ntt(int *a, const int op = 1)
} if (!op)
} inline void inv(int *a, int *b, int n)
static int c[n];
const int len = n + 1 >> 1;
inv(a, b, len);
init(n + n - 1);
std::copy(a, a + n, c), clear(c + n, c + lim);
ntt(c), ntt(b);
for (register int i = 0; i < lim; ++i) c[i] = static_cast(c[i]) * b[i] % mod;
ntt(c, 0), clear(c + n, c + lim);
for (int *i = c; i != c + n; ++i) *i = pmod - *i % pmod;
c[0] += 2, ntt(c);
for (int i = 0; i < lim; ++i) b[i] = static_cast(b[i]) * c[i] % mod;
ntt(b, 0);
for (int *i = b; i != b + n; ++i) *i %= pmod;
clear(b + n, b + lim);
} inline void pw(int *a, int *b, int n, int p)
if (p >>= 1)
} }#undef n
}int f[maxn], a[maxn], b[maxn];
int main()
洛谷P4049 JSOI2007 合金
某公司加工一種由鐵 鋁 錫組成的合金。他們的工作很簡單。首先進口一些鐵鋁錫合金原材料,不同種類的原材料中鐵鋁錫的比重不同。然後,將每種原材料取出一定量,經過融解 混合,得到新的合金。新的合金的鐵鋁錫比重為使用者所需要的比重。現在,使用者給出了 n 種他們需要的合金,以及每種合金中鐵鋁錫的比重。公司希...
洛谷P4049 JSOI2007 合金 題解
題目鏈結 首先,材料的前兩個屬性可以唯一確定乙個材料,合金的前兩個樹形也可以唯一確定乙個材料。那麼材料和合金都可以被看成平面上的點 a i,b i 或 d i,e i 不難發現,一些材料能表示出一種合金當且僅當這個合金 在平面上的點 在選取的材料 在平面上的點 組成的凸包內。不難發現,選取的點凸包上...
洛谷 P2145 JSOI2007 祖碼
一道特別毒瘤的題,好像目前沒有完全的正解,只有乙個比較優的解法 f i j 表示從i j所用的最小數量.首先,去重,就是將所有連續的相同的點縮成乙個點,sum i 表示縮點後新圖第i個位置有幾個點.如果g i g j 加起來的數量大於等於三 sum i sum j 3 則f i j f i 1 j ...