題意:給定一個序列,依次求出相鄰兩個數字的和,將得到一個新序列,重複上述過程直到最後的結果是是一個數。求最後的數除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;
}