P2624 [HNOI2008]明明的烦恼

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

typedef long long LL;

inline int read()
{
    char c=getchar();int num=0;bool f=1;
    for(;!isdigit(c);c=getchar())
        f=c=='-'?0:f;
    for(;isdigit(c);c=getchar())
        num=num*10+c-'0';
    return f?num:-num;
}

const int N=1e4+5;

int n,m;
int d[N],tot;

int prime[N],cnt;
bool flag[N];
void init()
{
    for(int i=2,t;i<N;++i)
    {
        if(!flag[i])
            prime[++cnt]=i;
        for(int j=1;j<=cnt&&(t=i*prime[j])<N;++j)
        {
            flag[t]=1;
            if(i%prime[j]==0)
                break;
        }
    }
}

inline LL ksm(LL x,LL k)
{
    LL res=1;
    while(k)
    {
        if(k&1)
            res=res*x;
        x*=x;
        k>>=1;
    }
    return res;
}

int num[N];

inline void chai(int x,int f)
{
    for(int i=1;i<=cnt&&x>1;++i)
    {
        while(x%prime[i]==0)
        {
            num[i]+=f;
            x/=prime[i];
        }
    }
    return;
}

int ans[N],l,x;
inline void mul(int *a)
{
    x=0;
    ans[1]=l=1;
    for(int i=1;i<=cnt;++i)
    {
        for(int j=1;j<=a[i];++j)
        {
            for(int k=1;k<=l;++k)
            {
                ans[k]=ans[k]*prime[i]+x;
                x=ans[k]/10;
                ans[k]%=10;
            }
            while(x)
            {
                ans[++l]=x%10,
                x/=10;
            }
        }
    }
}

int main()
{
//    freopen("3.in","r",stdin);
//    freopen("466.out","w",stdout);
    init();
    n=read();
    if(n==1)
    {
        n=read();
        if(n)
            putchar('0');
        else
            putchar('1');
        return 0;
    }
    for(int i=1;i<=n;++i)
    {
        d[i]=read();
        if(d[i]==0)
        {
            puts("0");
            return 0;
        }
        if(d[i]==-1)
            ++m;
        else
        {
            tot+=(d[i]-=1);
            for(int j=1;j<=d[i];++j)
                chai(j,-1);
        }
    }
    if(tot>n-2)
    {
        puts("0");
        return 0;
    }
    for(int i=1;i<=n-2-tot;++i)
        chai(i,-1);
    for(int i=1;i<=n-2;++i)
        chai(i,1);
    if(m>1)
    {
        for(int i=1;i<=n-2-tot;++i)
            chai(m,1);
    }
    mul(num);
    for(;l;--l)
        cout<<ans[l];
    return 0;
}
原文地址:https://www.cnblogs.com/lovewhy/p/9633675.html