题意:

有一个计数器,计数器的初始值为0,每次操作你可以把计数器的值加上中的任意一个整数,操作次数不限(可以为0次),问计数器的值对m取模后有几种可能,并输出这些可能。

思路:

裴蜀定理:

对任何整数a、b和它们的最大公约数d,关于未知数x和y的有整数解时当且仅当m是d的倍数。

特别地,有整数解当且仅当整数a和b互质。

为n个整数,d是它们的最大公约数,那么存在整数使得

对于这道题,有,则有,则当x为的倍数时该方程有整数解。

另,对于一个环,每个循环节的长度为n/gcd(n, k),k为每次走的步数。

代码:

typedef long long ll;
ll gcd(ll a,ll b)
{
    if(a<b){ll temp;temp=a;a=b;b=temp;}
    if(b==0)return a;
    while(a%b){ll r=a%b;a=b;b=r;}
    return b;
}
int main()
{
    int n;
    ll m,x;
    scanf("%d%lld",&n,&m);
    ll g=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&x);
        g=gcd(g,x);
    }
    g=gcd(g,m);
    printf("%lld\n",m/g);
    for(ll i=0;i<m;i+=g)
        printf("%lld ",i);
    printf("\n");
    return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

HDU6444 循环节+单调队列优化dp Previous
HDU6438 贪心+优先队列 Next