zoukankan      html  css  js  c++  java
  • POJ 3421 X-factor Chains

    线型素数筛+质因素分解+组合数。

    AC后发现这样做效率有点低。。766ms。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<time.h>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    typedef long long LL;
    int tol;
    LL factor[100];
    const int N = 2000001;
    LL prime[N] = {0},num_prime = 0;
    int isNotPrime[N] = {1, 1};
    
    void findfac(long long n)
    {
        for(int i=0; i<num_prime; i++)
        {
            if(n%prime[i]!=0) continue;
            while(1)
            {
                if(n==1||n%prime[i]!=0) break;
                factor[tol++]=prime[i];
                n=n/prime[i];
            }
            if(n==1) break;
        }
    }
    
    int num[100],tot;
    long long c[25][25];
    
    void init()
    {
        c[1][1]=1;
        for(int i=1; i<=20; i++) c[i][0]=1;
        for(int i=2; i<=20; i++)
        {
            for(int j=1; j<=20; j++)
            {
                c[i][j]=c[i-1][j-1]+c[i-1][j];
            }
        }
    
        for(long i = 2 ; i < N ; i ++)
        {
            if(! isNotPrime[i])
                prime[num_prime ++]=i;
            for(long j = 0 ; j < num_prime && i * prime[j] <  N ; j ++)
            {
                isNotPrime[i * prime[j]] = 1;
                if( !(i % prime[j] ) ) 
                    break;
            }
        }
    }
    
    int main()
    {
        init();
        long long n;
    
        while(~scanf("%lld",&n))
        {
            if(n==1) {
                printf("%d %lld
    ",1,1);
                continue;
            }
            tol=0;
            findfac(n);
            sort(factor,factor+tol);
    
            tot=0,num[tot]=1;
            for(int i=1;i<tol;i++)
            {
                if(factor[i]==factor[i-1]) num[tot]++;
                else
                {
                    tot++;
                    num[tot]=1;
                }
            }
            tot++;
            int sum=tol;
            int ans1=tol;
            long long ans2=1;
    
            for(int i=0;i<tot;i++)
            {
                ans2=ans2*c[sum][num[i]];
                sum=sum-num[i];
            }
            printf("%d %lld
    ",ans1,ans2);
        }
    
        return 0;
    }
  • 相关阅读:
    对象的存在是因为别人要用它
    图书馆借书程序我的分析
    版权迷思
    第四章 算法
    不可持续的天才教育
    第一章 你要做什么?
    win8 开发新格局分析
    水果机的几率设计
    我的理想
    windows 8,微软创新之路
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5373622.html
Copyright © 2011-2022 走看看