RT WA on #6
大概思路是反正不超过1017,开int128然后强行搞逆元((但#6WA了说明应该乘爆了x
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n;
const __int128 MOD=1e17+9;
inline __int128 FastPow(__int128 x,__int128 y)
{
__int128 ans=x!=0;
for(;y;x=x*x%MOD,y>>=1)
if(ans&1) ans*=x,ans%=MOD;
return ans%MOD;
}
inline void Print(__int128 x)
{
if(x>9) Print(x/10);
putchar(x%10+'0');
}
signed main(void)
{
cin>>n;
if(n==1) {scanf("%d",&n)&&n?puts("0"):puts("1");return 0;}
__int128 ans=1;
int sum=0;
for(int i=1;i<=n-2;i++)
{
__int128 temp=i;
ans*=temp,ans%=MOD;
}
for(int i=1,degree=0;i<=n;i++)
{
scanf("%d",°ree),sum+=degree-1;
if(!degree) {puts("0");return 0;}
if(degree==1) continue;
__int128 fact=1;
for(int j=2;j<=degree-1;j++)
{
__int128 temp=j;
fact*=temp,fact%=MOD;
}
ans*=FastPow(fact,MOD-2),ans%=MOD;
}
if(sum!=n-2) {puts("0");return 0;}
Print(ans);
return 0;
}