zoukankan      html  css  js  c++  java
  • 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
    ",num);
            if(num) {
                for(int i=1;i<num;i++) 
                    printf("%d ",ans[i]+1);
                printf("%d",ans[num]+1);
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    JavaScript创建对象及对象继承
    Shell基础学习小结
    深入理解Java反射
    STL"源码"剖析-重点知识总结
    Java IO工作机制分析
    优先队列原理与实现
    CleanBlog(个人博客+源码)
    线性时间排序
    深入理解FTP协议
    Spring学习之AOP总结帖
  • 原文地址:https://www.cnblogs.com/invoid/p/5574533.html
Copyright © 2011-2022 走看看