uvaIrrelevant Elements

唯一分解定理。

可以看出在最后每个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\n",num);
        if(num) {
            for(int i=1;i<num;i++) 
                printf("%d ",ans[i]+1);
            printf("%d",ans[num]+1);
        }
        printf("\n");
    }
    return 0;
}
posted @ 2016-06-10 23:51  invoid  阅读(157)  评论(0编辑  收藏  举报