题解:CF1010C Border
形式化一下题意,就是求使得下式成立的 rrr 的个数。
a1x1+a2x2+⋯+anxn=pk+r(xi,p,r≥0) a_1x_1 + a_2x_2 + \cdots + a_nx_n = pk + r (x_i,p,r \ge 0) a1x1+a2x2+⋯+anxn=pk+r(xi,p,r≥0)
把 rrr 看成定值,由裴蜀定理可知上式有解当且仅当
gcd(a1,a2,⋯ ,an)∣pk+r \gcd(a_1,a_2,\cdots,a_n) \mid pk + r gcd(a1,a2,⋯,an)∣pk+r
设 g=gcd(a1,a2,⋯ ,an)g = \gcd(a_1,a_2,\cdots,a_n)g=gcd(a1,a2,⋯,an),则可以改写成
tg=pk+r tg = pk + r tg=pk+r
其中 g,k,rg,k,rg,k,r 为定值,因此移项可得
gt−kp=r gt - kp = r gt−kp=r
容易发现这就是 ax+by=cax + by = cax+by=c 的变式,有解当且仅当
gcd(g,−k)∣r \gcd (g,-k) \mid r gcd(g,−k)∣r
因此答案为 {gcd(g,−k)×0,gcd(g,−k)×1,⋯ ,gcd(g,−k)×(m−1)}\{\gcd(g,-k) \times 0,\gcd(g,-k) \times 1,\cdots,\gcd(g,-k) \times (m - 1)\}{gcd(g,−k)×0,gcd(g,−k)×1,⋯,gcd(g,−k)×(m−1)},其中 m=⌊kgcd(g,−k)⌋m = \lfloor\dfrac{k}{\gcd(g,-k)}\rfloorm=⌊gcd(g,−k)k⌋。注意此处的 gcd\gcdgcd 均为正数,可以在计算时直接去掉负号。
void solve ()
{int n = read (),k = read (),g = 0;vector <int> a (n + 1);for (int i = 1;i <= n;++i) a[i] = read (),g = __gcd (a[i],g);int tot = k / __gcd (g,k);printf ("%d\n",tot);for (int i = 0;i < tot;++i) printf ("%d ",i * __gcd (g,k));puts ("");
}