题解: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,r0)

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 gtkp=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)×(m1)},其中 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 ("");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值