⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soj3020多重集的排列问题.cpp

📁 一些ACM题目的解答,主要是soj和poj的
💻 CPP
字号:
#include<stdio.h>
#include<string.h>

const int MAX = 2<<20+1;

bool icon[MAX];

long prime[MAX];

int next(int i)
{
    int j=i+1;
    while(!icon[j]&&j<MAX)
        j++;
    return j;
}
int primelist(void)
{
    long i,j;
    icon[0]=icon[1]=false;
    for(i=2;i*i<MAX;i=next(i))
    {
        for(j=i;i*j<MAX;j++)
        {
            if(i*j<0)
                break;
            icon[i*j]=false;
        }
    }
    for(i=2,j=0;i<MAX;i++)
    {
        if(icon[i])
            prime[j++]=i;
    }
    return j;
}

int main(void)
{
    memset(icon,true,sizeof(icon));
    int len = primelist();
    int n;
    long long jie[21];
    jie[0]=1;
    for(n=1;n<21;n++)
        jie[n]=jie[n-1]*n;
    int factor[10000];
    while(scanf("%d",&n)!=EOF)
    {
if(icon[n])
{
printf("1 1\n");
continue;
}
        memset(factor,0,sizeof(factor));
        int n1=n;
        int i=0,max=0;
        int num=0;
        while(n1!=1)
        {    
            while(n1%prime[i]==0)
            {
                factor[num]++;
                n1/=prime[i];
            }
            if(n%prime[i]==0)
            {
                max+=factor[num];
                num++;
            }
            i++;
        }
        long long result=jie[max];
        for(i=0;i<num;i++)
        {
            if(factor[i]>1)
            {
                result/=jie[factor[i]];
            }
        }
        printf("%d %lld\n",max,result);
    }
    return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -