lightoj 1035 Intelligent Factorial Factorization 因式分解

来源:互联网 发布:php pdf完整版 编辑:程序博客网 时间:2024/05/01 02:03

题意:因式分解n!。

题解:n很小,<=100。所以可以先找出100内的所有素数,由阶乘性质可知,100以内的阶乘因式分解后的质因子一定小于它本身。所以暴力分解小于n的数,质因子的指数想家即可。



#include <cstdio>#include <cmath>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn=101;int vis[maxn],t,prime[maxn];int c[maxn][maxn],ans[maxn];void init(){    int i,j,k,n,m;    t=0;    memset(vis,0,sizeof(vis));    memset(c,0,sizeof(c));    for(i=2;i<maxn;i++)    {        if(!vis[i])        {            for(j=i*i;j<maxn;j+=i)            vis[j]=1;            prime[t++]=i;        }    }    for(i=2;i<=100;i++)    {        m=i;        n=(int)sqrt(m+0.5);        for(j=2;j<=n;j++)        {            while(m%j==0){c[i][j]++;m/=j;}        }        if(m>1)        c[i][m]++;    }}int main(){    init();    int T,n,tt=0;    scanf("%d",&T);    while(T--)    {        int i,j,k;        scanf("%d",&n);        memset(ans,0,sizeof(ans));        for(i=2;i<=n;i++)        {            for(j=0;j<t;j++)            {                ans[j]+=c[i][prime[j]];            }        }        printf("Case %d: %d = 2 (%d)",++tt,n,ans[0]);        for(i=1;i<t;i++)        {            if(ans[i]==0)break;            printf(" * %d (%d)",prime[i],ans[i]);        }        printf("\n");    }    return 0;}