看到一个很大的数字的什么什么的余数就要想到唯一分解定律
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
void Getprimes(int n,vector<int>& p)
{
int m=sqrt(n+0.5);
for(int i=2;i<=m;i++)
{
if(n%i==0)
{
p.push_back(i);
while(n%i==0) n/=i;
}
}
if(n>1) p.push_back(n); //除不到一就说明剩下来的也是素因数
}
int bad[100000+5];
int main()
{
int n,m;
while(cin>>n>>m)
{
vector<int> primes;
Getprimes(m,primes);
memset(bad,0,sizeof(bad));
n--; //杨辉三角是从第0层开始数的,所以为(a+b)^(n-1);
for(int i=0;i<primes.size();i++)
{
int p=primes[i],min_e=0;
int x=m;
while(x%p==0) { x/=p;min_e++; } //m的primes[i]的系数
int e=0;
for(int k=1;k<n;k++) //因为e不清零所以还是保存着c(n,k-1)的指数
{ //第一项还有最后一项系数都是1,不可能被整除,所以不用判断了
x=n-k+1; //n-k+1的primes[i]的系数
while(x%p==0) { x/=p;e++; }
x=k;
while(x%p==0) { x/=p;e--; } //k的primes[i]的系数
if(min_e>e) bad[k]=1; //(n-k+1)/(k*m)的系数>0代表可整除
}
}
vector<int> ans;
for(int k=1;k<n;k++)
if(!bad[k]) ans.push_back(k+1); // 编号从1开始
cout<<ans.size()<<endl;
if(!ans.empty())
{
cout<<ans[0];
for(int i=1;i<ans.size();i++)
cout<<' '<<ans[i];
}
cout<<endl;
}
return 0;
}