n个数 一层一层往下加就会形成类似杨辉三角形的形状 到了最后一行 系数呈现二项式定理分布 从 C(n-1,0)到C(n-1,n-1) 又因为m至少为2 所有C(n-1,0) C(n-1,n-1)可以不用算 又因为公式C(n,k)=(n-k+1)/kC(n,k-1)可用用递推关系算 只要在前一个的基础上乘以那个递推系数
#include<bits/stdc++.h>
using namespace std;
vector<int>prime;
bool bad[100000+5];
void prime_solve(int n){//筛一下素数
int m=sqrt(n+0.5);
for(int i=2;i<=m;i++){
if(n%i==0){
prime.push_back(i);
while(n%i==0)n/=i;
}
}
if(n>1)prime.push_back(n);
}
int main(){
int n,m;
while(cin>>n>>m){
prime.clear();
prime_solve(m);
memset(bad,0,sizeof(bad));
n--; //最后的系数是 c(n-1,0)到c(n-1,n-1) 所以n--
for(int i=0;i<prime.size();i++){
int p=prime[i],mine=0,tempe=0;
int x=m;
while(x%p==0){ //分解m
mine++;
x/=p;
}
for(int k=1;k<n;k++){ 从C(n-1,1)到C(n-1,n-2)分解 因为是递推关系所以可以一直用tempe
x=n-k+1;
while(x%p==0){
tempe++;
x/=p;
}
x=k;
while(x%p==0){
tempe--;
x/=p;
}
if(tempe<mine)bad[k]=1;
}
}
vector<int> ans;
for(int k = 1; k < n; k++)
if(!bad[k]) ans.push_back(k+1);
cout << ans.size() << "\n";
if(!ans.empty()) {
cout << ans[0];
for(int i = 1; i < ans.size(); i++) cout << " " << ans[i];
}
cout << "\n";
}
}