[UVA 1635] Irrelevant Elements

題意:給定一個序列,依次求出相鄰兩個數字的和,將得到一個新序列,重複上述過程直到最後的結果是是一個數。求最後的數除m的餘數和原序列中的那些數無關。

分析:根據觀察加完之後的序列的係數

e.g.    n=4  1 4 4 1  n=5 1 4 6 4 1

正好符合楊輝三角,因此,本題轉換爲求楊輝三角的係數

上代碼

// author: andyc_03
//Run ID	Username  OJ  Prob  Result    Time(ms)	Length	Lang 
//19900169	andyc_03 UVA  1635  Accepted   90		1106	C++
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int prime[10001][3];
int a[100006];
int temp[10001];
int n,m,cnt;
void depart_prime()
{
	memset(temp,0,sizeof(temp));
	memset(a,0,sizeof(a));
	cnt=0;
	for(int i=2;i*i<=m;i++)
	{
		if(m%i==0)
		{
			prime[++cnt][0]=i;
			prime[cnt][1]=0;
			while(m%i==0)
			{
				prime[cnt][1]++;
				m/=i;
			}
		}
	}
	if(m>1)
	{
		prime[++cnt][0]=m;
		prime[cnt][1]=1;
	}
}
bool check(int x)
{
	int aa=n-x,bb=x;
	for(int j=1;j<=cnt;j++)
	{
		int p1=prime[j][0];
		while(aa%p1==0)
		{
			aa/=p1;
			temp[j]++;
		}
		while(bb%p1==0)
		{
			bb/=p1;
			temp[j]--;
		}
	}
	for(int j=1;j<=cnt;j++)
	{
		if(temp[j]<prime[j][1])
			return false;
	}
	return true;
}
int main()
{
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	while(scanf("%d%d",&n,&m)==2)
	{
		int ans=0;
		depart_prime();
		for(int i=1;i<n-1;i++)
		{
			if(check(i)==true)
				a[++ans]=i;
		}
		printf("%d\n",ans);
		for(int i=1;i<=ans;i++)
		{
			if(i!=ans)
				printf("%d ",a[i]+1);
			else
				printf("%d",a[i]+1);
		}
		printf("\n");
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章