题意:
有一个计数器,计数器的初始值为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 协议 ,转载请注明出处!