C. Border(裴蜀定理,最大公约数)

这道题涉及到一个很重要的数学定理 裴蜀定理

, p e i   s h u 来和我读,是pei\ shu定理

n x , n 大概意思是n个数的最大公约数是x,那么这n个数如果用无限次

k x ( k ) 那么可以凑到kx(k是任何数)

所以计算n个数的公约数x,若x==1互质,就能凑成任何数

否则,有公约数x,那么可以不管这n个数了,直接用他们的因子去凑

判断有多少数能凑出来

#include <bits/stdc++.h>
using namespace std;
const int maxn=100009;
int n,k,ans,mark;
int a[maxn],vis[maxn],minn=1e9;
int gcd(int a,int b){
	return b==0?a:gcd(b,a%b);
}
int main()
{
	cin >> n >> k;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i],a[i]%=k;
		if(i==1)	mark=a[i];
		else	mark=gcd(mark,a[i]);
	}
	if(mark==1)
	{
		cout<<k<<endl;
		for(int i=0;i<k;i++)	cout<<i<<" ";//所有数都能取到 
		return 0;
	}
	sort(a+1,a+1+n);
	int temp=0;
	for(int i=1;i<=k;i++)
	{
		temp=(temp+mark)%k;
		if(vis[temp])	break;
		ans++,vis[temp]=1;
	}
	cout<<ans<<endl;
	for(int i=0;i<k;i++)
		if(vis[i])	cout<<i<<" ";
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/106910917