唯一分解定理。
可以看出在最后每个a的系数是杨辉三角的第n行。
但是不能递推,否则会tle。
就从C(n-1,0)开始乘n-k再除以k。记录下每个的系数,如果该项系数小于m就代表和答案有关。
代码里的ok为true时,代表和答案有关。
#include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int maxn = 100000 + 10; bool ok[maxn]; int n,m; int e[maxn],prime[maxn],cnt,num; int ans[maxn]; void init(int n) { memset(e,0,sizeof(e)); cnt=0; num=0; int m = (int) sqrt(n); for(int i=2;i<=m;i++) if(n%i==0) { prime[++cnt]=i; while(n%i==0) { e[cnt]++; n/=i; } } if(n>1) { prime[++cnt]=n; e[cnt]=1; } } int main() { while(scanf("%d%d",&n,&m)==2) { init(m); memset(ok,0,sizeof(ok)); for(int i=1,h;i<=cnt;i++) { int res=0; for(int k=1,x;k<n;k++) { x=n-k; while(x%prime[i]==0) { x/=prime[i]; res++; } x=k; while(x%prime[i]==0) { x/=prime[i]; res--; } if(res<e[i]) ok[k]=1; } } for(int i=1;i<n;i++) if(!ok[i]) ans[++num]=i; printf("%d ",num); if(num) { for(int i=1;i<num;i++) printf("%d ",ans[i]+1); printf("%d",ans[num]+1); } printf(" "); } return 0; }