zoukankan      html  css  js  c++  java
  • POJ2992 Divisors(因子个数)

    题意:给n和k,求组合C(n,k)的因子个数。

    这道题,若一开始先预处理出C[i][j]的大小,再按普通方法枚举2~sqrt(C[i][j])来求解对应的因子个数,会TLE。
    所以得用别的方法。

    在说方法前,先说一个n!的性质:
    n!的素因子分解中的素数p的个数为
    n/p+n/(p^2)+...+n/(p^k)+...

    《ACM-ICPC程序设计系列 数论及应用》上的方法,200+ms:
    首先先求解435以内的素因子。
    然后预处理出j!中每个素因子的个数,公式如下:
    num[j][i]=j/prime[i]+num[j/prime[i]][i];

    设n!中素因子p的个数为:a=n/p+n/(p^2)+...+n/(p^k)+...
    那么(n/p)!中素因子p的个数为:b=n/(p^2)+...+n/(p^k)+...
    很显然a=b+n/p,因此可以利用上述递推公式预处理出所有的j!中每个素因子的个数。

    接下来就可以预处理出C(i,j)的因子个数,然后一切就好办了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define ll long long
    
    using namespace std;
    const int maxn=435;
    bool isprime[maxn];
    int prime[maxn];
    int num[maxn][maxn];
    ll C[maxn][maxn];
    int cnt=0;
    
    void init()
    {
        int cnt=0;
        memset(isprime,true,sizeof(isprime));
        for(int i=2;i<maxn;i++){
            if(isprime[i]){
                prime[cnt++]=i;
                for(int j=i*2;j<maxn;j+=i){
                    isprime[j]=false;
                }
            }
        }
        memset(num,0,sizeof(num));
        for(int i=0;i<cnt;i++){
            for(int j=1;j<maxn;j++){
                num[j][i]=j/prime[i]+num[j/prime[i]][i];
            }
        }
        for(int i=1;i<maxn;i++)
        {
            for(int j=1;j<i;j++)
            {
                C[i][j]=1;
                for(int k=0;k<cnt;k++)
                {
                    int d=num[i][k]-num[i-j][k]-num[j][k];
                    if(d)
                        C[i][j]*=d+1;
                }
            }
        }
    }
    
    
    int main()
    {
        init();
        int n,k;
        while(scanf("%d%d",&n,&k)!=EOF){
            if(n==k ||k==0)
                printf("1
    ");
            else
                printf("%lld
    ",C[n][k]);
        }
        return 0;
    }
  • 相关阅读:
    Windows JScript 在 游览器 中运行 调试 Shell 文件系统
    autohotkey 符号链接 软连接 symbolink
    软链接 硬链接 测试
    SolidWorks 修改 基准面 标准坐标系
    手机 路径 WebDAV 映射 驱动器
    Win10上手机路径
    explorer 命令行
    单位公司 网络 封锁 屏蔽 深信 AC
    cobbler自动化部署原理篇
    Docker四种网络模式
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9788241.html
Copyright © 2011-2022 走看看